Skip to main content
Glama

Compress images

compress_images

Compress, convert or resize images. Send public image addresses in urls, uploads made with create_upload_link in upload_ids, or small files inline as base64 in files. Each image counts one against the account's daily images and compressions a minute, the same as on the website. Images are queued and compress in the background, usually in a few seconds: call get_image with each id until its status is completed, already-optimized, failed or cancelled, then download it from its download_url. Each image also gets an AI alt text and a suggested file name unless alt_text is false; they arrive in alt_text a few seconds after the image is completed or already-optimized. One call takes up to 20 images across urls, upload_ids and files; send the rest in another.

Input Schema

NameRequiredDescriptionDefault
urlsNoPublic http or https addresses of images to fetch. Iminify refuses private networks, follows up to five redirects and names each file after its address.
filesNoSmall files sent inline, up to 4 MB each. Use create_upload_link for anything bigger.
levelNoHow hard to compress. "smart" (the default) finds the lowest quality that still looks like the original; "ultra" goes further and softens fine texture a little; "lossless" changes no pixel unless a size_limit needs it to; "none" only converts, resizes, fits a size limit and strips metadata.
scaleNoResize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG.
widthNoResize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can.
folderNoPaid plans: the folder every image of this call belongs in, like "holiday/beach", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required.
formatNoConvert to this format. "auto" encodes every format that can hold the image and keeps the smallest. Leave it out to keep each image's own format (a HEIC or TIFF always comes back in another one).
heightNoResize to this height in pixels, the same way as width.
alt_textNoWrite an alt text and a suggested file name for each image with AI. On by default; false leaves it out. They arrive a few seconds after the image finishes, each counting against the account's daily AI alt texts; once those are used up the images still compress, without one.
size_limitNoThe most each optimized file may weigh, in KB of 1,000 bytes, for a form or a page with a file size limit ("under 100 KB" is 100). Iminify lowers the quality until it fits, and makes the image smaller in pixels when the lowest quality is still over. The limit comes before the level: under "lossless" or "none", a file over it is encoded again with loss. A PNG or GIF kept in its own format that is over the limit comes back as JPG, WebP or AVIF, so format "png" is refused with it; animations are never fitted. Each finished image's size_limit_status says under, resized or over.
upload_idsNoUpload ids from create_upload_link whose file has been sent. Each upload can be compressed once.
keep_metadataNoKeep the EXIF metadata (camera, date, location). Off by default, which strips it; the orientation is applied to the pixels first.
alt_text_languageNoThe language to write the alt text in, as a language tag. English ("en") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise.
responsive_widthsNoPaid plans: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required.
use_suggested_nameNoRename the optimized copy to the suggested file name as soon as the alt text arrives, unless it already has a new name by then. Off by default.

Output Schema

NameRequiredDescriptionDefault
nextNo
imagesNoThe images queued.
refusedNoThe sources refused, each with the reason.
not_startedNoAddresses not fetched because the call ran out of time.
not_started_noteNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / folder / description
      Previous value: -"Pro: the folder every image of this call belongs in, like \"holiday/beach\", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required."New value: +"Paid plans: the folder every image of this call belongs in, like \"holiday/beach\", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required."
    • changedInput schema / properties / responsive_widths / description
      Previous value: -"Pro: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required."New value: +"Paid plans: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required."
    • changedOutput schema / properties / images / items / properties / responsive / description
      Previous value: -"The responsive sizes (Pro), or null when none were asked for. list_images carries only their status."New value: +"The responsive sizes (paid plans), or null when none were asked for. list_images carries only their status."
  2. Changed12 schema fields changed
    • addedInput schema / properties / folder
      Added value: +{
      +  "description": "Pro: the folder every image of this call belongs in, like \"holiday/beach\", so create_zip puts them there. Send each folder's images in a call of their own. On another plan the call is refused with pro_required.",
      +  "type": "string"
      +}
    • changedInput schema / properties / level / description
      Previous value: -"How hard to compress. \"smart\" (the default) finds the lowest quality that still looks like the original; \"ultra\" goes further and softens fine texture a little; \"lossless\" changes no pixel; \"none\" only converts, resizes and strips metadata."New value: +"How hard to compress. \"smart\" (the default) finds the lowest quality that still looks like the original; \"ultra\" goes further and softens fine texture a little; \"lossless\" changes no pixel unless a size_limit needs it to; \"none\" only converts, resizes, fits a size limit and strips metadata."
    • addedInput schema / properties / responsive_widths
      Added value: +{
      +  "description": "Pro: also make each image at these widths in pixels, for an <img srcset>, like [480, 768, 1200, 1600], the website's default. Each width is made from the original, at the same level and in the delivered format, and never enlarged: one wider than the image is made at its own width, once. They are made a few seconds after the image finishes; responsive on the image lists them. On another plan the call is refused with pro_required.",
      +  "items": {
      +    "maximum": 65535,
      +    "minimum": 16,
      +    "type": "integer"
      +  },
      +  "maxItems": 8,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / size_limit
      Added value: +{
      +  "description": "The most each optimized file may weigh, in KB of 1,000 bytes, for a form or a page with a file size limit (\"under 100 KB\" is 100). Iminify lowers the quality until it fits, and makes the image smaller in pixels when the lowest quality is still over. The limit comes before the level: under \"lossless\" or \"none\", a file over it is encoded again with loss. A PNG or GIF kept in its own format that is over the limit comes back as JPG, WebP or AVIF, so format \"png\" is refused with it; animations are never fitted. Each finished image's size_limit_status says under, resized or over.",
      +  "minimum": 5,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / images / items / properties / content_credentials
      Added value: +{
      +  "description": "The Content Credentials (a signed C2PA record of where the image came from) the file sent carried, or null when it carried none, and until the image has finished.",
      +  "properties": {
      +    "generative_ai": {
      +      "description": "Whether they say generative AI made the image, as they state it; the signature is not checked.",
      +      "type": "boolean"
      +    },
      +    "status": {
      +      "description": "removed: the optimized copy no longer carries them. kept: the optimized copy is the file that was sent, unchanged.",
      +      "enum": [
      +        "removed",
      +        "kept"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "generative_ai"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / images / items / properties / folder
      Added value: +{
      +  "description": "The folder it was sent with, which a zip puts it in. Null for an image on its own.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / images / items / properties / responsive
      Added value: +{
      +  "description": "The responsive sizes (Pro), or null when none were asked for. list_images carries only their status.",
      +  "properties": {
      +    "download_url": {
      +      "description": "A zip of every width, once ready. Works without a token for an hour. Not in list_images.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "files": {
      +      "description": "Each width, narrowest first, once ready. Not in list_images.",
      +      "items": {
      +        "properties": {
      +          "download_url": {
      +            "description": "Works without a token for an hour.",
      +            "type": "string"
      +          },
      +          "height": {
      +            "type": "integer"
      +          },
      +          "name": {
      +            "description": "The name it downloads under, which html uses.",
      +            "type": "string"
      +          },
      +          "size": {
      +            "description": "Bytes.",
      +            "type": "integer"
      +          },
      +          "width": {
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "width",
      +          "height",
      +          "size",
      +          "name",
      +          "download_url"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "html": {
      +      "description": "An <img srcset> naming the files, once ready. Not in list_images.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "pending: being made, a few seconds after the image is completed or already-optimized. ready: every width is made. failed: none was kept; compress it again with responsive_widths. skipped: an animation gets none.",
      +      "enum": [
      +        "pending",
      +        "ready",
      +        "failed",
      +        "skipped"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "status"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / images / items / properties / settings / properties / responsive_widths
      Added value: +{
      +  "description": "The responsive widths asked for, or null.",
      +  "items": {
      +    "type": "integer"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / images / items / properties / settings / properties / size_limit
      Added value: +{
      +  "description": "The most the optimized copy may weigh, in KB of 1,000 bytes, or null.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / images / items / properties / settings / required
      Previous value: -[
      -  "level",
      -  "format",
      -  "keep_metadata",
      -  "width",
      -  "height",
      -  "scale"
      -]New value: +[
      +  "level",
      +  "format",
      +  "keep_metadata",
      +  "width",
      +  "height",
      +  "scale",
      +  "size_limit",
      +  "responsive_widths"
      +]
    • addedOutput schema / properties / images / items / properties / size_limit_status
      Added value: +{
      +  "description": "Against settings.size_limit: under, resized (made smaller in pixels to fit) or over. Null without a limit, and until the image has finished.",
      +  "enum": [
      +    "under",
      +    "resized",
      +    "over",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / images / items / required
      Previous value: -[
      -  "id",
      -  "status",
      -  "name",
      -  "original",
      -  "optimized",
      -  "saved_bytes",
      -  "saved_percent",
      -  "settings",
      -  "alt_text",
      -  "scan_id",
      -  "source_url",
      -  "share_url",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "id",
      +  "status",
      +  "name",
      +  "original",
      +  "optimized",
      +  "saved_bytes",
      +  "saved_percent",
      +  "settings",
      +  "size_limit_status",
      +  "content_credentials",
      +  "alt_text",
      +  "responsive",
      +  "scan_id",
      +  "source_url",
      +  "folder",
      +  "share_url",
      +  "created_at",
      +  "updated_at"
      +]
  3. Changed2 schema fields changed
    • changedInput schema / properties / scale / description
      Previous value: -"Resize to this percentage of the original, 1 to 100. Not together with width or height."New value: +"Resize to this percentage of the original, 1 to 100. Not together with width or height. Like width, it is refused for an animated WebP or PNG."
    • changedInput schema / properties / width / description
      Previous value: -"Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size."New value: +"Resize to this width in pixels. Alone, the height follows the aspect ratio; with height too, the image is resized to exactly that size. An animated WebP or PNG cannot be resized and is refused with animation_not_resizable; an animated GIF can."
  4. Changed5 schema fields changed
    • addedInput schema / properties / alt_text
      Added value: +{
      +  "description": "Write an alt text and a suggested file name for each image with AI. On by default; false leaves it out. They arrive a few seconds after the image finishes, each counting against the account's daily AI alt texts; once those are used up the images still compress, without one.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / alt_text_language
      Added value: +{
      +  "description": "The language to write the alt text in, as a language tag. English (\"en\") by default. The suggested file name follows it for languages written in the Latin alphabet and is in English otherwise.",
      +  "enum": [
      +    "en",
      +    "es",
      +    "fr",
      +    "de",
      +    "it",
      +    "pt",
      +    "nl",
      +    "pl",
      +    "sv",
      +    "tr",
      +    "ru",
      +    "uk",
      +    "ar",
      +    "fa",
      +    "he",
      +    "hi",
      +    "id",
      +    "vi",
      +    "th",
      +    "ja",
      +    "ko",
      +    "zh-Hans",
      +    "zh-Hant"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / use_suggested_name
      Added value: +{
      +  "description": "Rename the optimized copy to the suggested file name as soon as the alt text arrives, unless it already has a new name by then. Off by default.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / images / items / properties / alt_text
      Added value: +{
      +  "description": "The AI alt text, or null when none was asked for.",
      +  "properties": {
      +    "language": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "pending: being written, a few seconds after the image is completed or already-optimized; it waits for a retry while the image is failed or cancelled. written: ready. failed: ask again with write_alt_text. skipped: the day's AI alt texts were used up.",
      +      "enum": [
      +        "pending",
      +        "written",
      +        "failed",
      +        "skipped"
      +      ],
      +      "type": "string"
      +    },
      +    "suggested_name": {
      +      "description": "A descriptive file name without an extension, for rename_image.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "text": {
      +      "description": "One sentence for the image's alt attribute, once written.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "text",
      +    "language",
      +    "suggested_name"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / images / items / required
      Previous value: -[
      -  "id",
      -  "status",
      -  "name",
      -  "original",
      -  "optimized",
      -  "saved_bytes",
      -  "saved_percent",
      -  "settings",
      -  "scan_id",
      -  "source_url",
      -  "share_url",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "id",
      +  "status",
      +  "name",
      +  "original",
      +  "optimized",
      +  "saved_bytes",
      +  "saved_percent",
      +  "settings",
      +  "alt_text",
      +  "scan_id",
      +  "source_url",
      +  "share_url",
      +  "created_at",
      +  "updated_at"
      +]
  5. Changed2 schema fields changed
    • addedOutput schema / properties / images / items / properties / source_url
      Added value: +{
      +  "description": "The address it was fetched from: its address on the scanned page, or the url it was sent as. Null for a file.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / images / items / required
      Previous value: -[
      -  "id",
      -  "status",
      -  "name",
      -  "original",
      -  "optimized",
      -  "saved_bytes",
      -  "saved_percent",
      -  "settings",
      -  "scan_id",
      -  "share_url",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "id",
      +  "status",
      +  "name",
      +  "original",
      +  "optimized",
      +  "saved_bytes",
      +  "saved_percent",
      +  "settings",
      +  "scan_id",
      +  "source_url",
      +  "share_url",
      +  "created_at",
      +  "updated_at"
      +]
  6. Changed2 schema fields changed
    • addedOutput schema / properties / images / items / properties / settings / properties / format
      Added value: +{
      +  "description": "The format asked for, or null when none was sent. auto stays auto after the image finishes.",
      +  "enum": [
      +    "auto",
      +    "webp",
      +    "avif",
      +    "png",
      +    "jpg",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / images / items / properties / settings / required
      Previous value: -[
      -  "level",
      -  "keep_metadata",
      -  "width",
      -  "height",
      -  "scale"
      -]New value: +[
      +  "level",
      +  "format",
      +  "keep_metadata",
      +  "width",
      +  "height",
      +  "scale"
      +]
  7. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "images": {
      +      "description": "The images queued.",
      +      "items": {
      +        "properties": {
      +          "created_at": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "hint": {
      +            "description": "What to do next, when the status alone does not say.",
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "The image's id.",
      +            "type": "string"
      +          },
      +          "name": {
      +            "description": "The name the optimized copy downloads under.",
      +            "type": "string"
      +          },
      +          "optimized": {
      +            "description": "Null until the image has finished.",
      +            "properties": {
      +              "download_url": {
      +                "description": "Works without a token for an hour.",
      +                "type": "string"
      +              },
      +              "format": {
      +                "type": "string"
      +              },
      +              "height": {
      +                "type": "integer"
      +              },
      +              "name": {
      +                "type": "string"
      +              },
      +              "size": {
      +                "description": "Bytes.",
      +                "type": "integer"
      +              },
      +              "width": {
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "name",
      +              "format",
      +              "size",
      +              "width",
      +              "height",
      +              "download_url"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "original": {
      +            "properties": {
      +              "download_url": {
      +                "description": "Works without a token for an hour.",
      +                "type": "string"
      +              },
      +              "format": {
      +                "type": "string"
      +              },
      +              "height": {
      +                "type": "integer"
      +              },
      +              "name": {
      +                "type": "string"
      +              },
      +              "size": {
      +                "description": "Bytes.",
      +                "type": "integer"
      +              },
      +              "width": {
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "name",
      +              "format",
      +              "size",
      +              "width",
      +              "height",
      +              "download_url"
      +            ],
      +            "type": "object"
      +          },
      +          "saved_bytes": {
      +            "description": "Negative when the optimized copy is larger.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "saved_percent": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "scan_id": {
      +            "description": "The page scan that found it, if one did.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "settings": {
      +            "properties": {
      +              "height": {
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "keep_metadata": {
      +                "type": "boolean"
      +              },
      +              "level": {
      +                "enum": [
      +                  "none",
      +                  "lossless",
      +                  "ultra",
      +                  "smart",
      +                  null
      +                ],
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "scale": {
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "width": {
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "level",
      +              "keep_metadata",
      +              "width",
      +              "height",
      +              "scale"
      +            ],
      +            "type": "object"
      +          },
      +          "share_url": {
      +            "description": "Its public page, once shared.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "status": {
      +            "enum": [
      +              "queued",
      +              "optimizing",
      +              "completed",
      +              "failed",
      +              "already-optimized",
      +              "cancelled"
      +            ],
      +            "type": "string"
      +          },
      +          "updated_at": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "status",
      +          "name",
      +          "original",
      +          "optimized",
      +          "saved_bytes",
      +          "saved_percent",
      +          "settings",
      +          "scan_id",
      +          "share_url",
      +          "created_at",
      +          "updated_at"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "next": {
      +      "type": "string"
      +    },
      +    "not_started": {
      +      "description": "Addresses not fetched because the call ran out of time.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "not_started_note": {
      +      "type": "string"
      +    },
      +    "refused": {
      +      "description": "The sources refused, each with the reason.",
      +      "items": {
      +        "properties": {
      +          "code": {
      +            "type": "string"
      +          },
      +          "message": {
      +            "type": "string"
      +          },
      +          "retry_after": {
      +            "description": "Seconds to wait before sending it again.",
      +            "type": "integer"
      +          },
      +          "source": {
      +            "description": "The address, upload id or file name refused.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "source",
      +          "message",
      +          "code"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  8. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only declaring non-read-only, non-destructive and open-world, the description carries the real behavioural load: images are queued and processed asynchronously in seconds, each image consumes a daily quota and per-minute compression rate, polling is required, and alt text arrives late and is quota-limited. It also notes the 20-image cap and the Boolean opt-out for alt text. None of this is derivable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose first, then input routes, then quota, then the async poll-and-download workflow, then alt text, then the batch cap. Every sentence carries information, though the run-on sentences and repeated 'a few seconds' phrasing could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A 15-parameter asynchronous job tool with an output schema; the description correctly avoids explaining return values and instead supplies the missing operational context — async lifecycle, mandatory follow-up with get_image, download_url, and delayed alt text. Nothing needed to invoke and then retrieve results is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3; the description adds value by explaining that url, upload_id and inline file inputs can be mixed up to a combined 20-image ceiling, a cross-parameter constraint the schema does not state. It does not add much on level, scale/width/height or size_limit, leaving those to the rich schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific triple verb (compress, convert, resize) on a specific resource, then immediately enumerates the three input routes (urls, upload_ids, files), which is the main ambiguity for this tool. Clear against siblings like create_upload_link and get_image, which are named in their roles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to guidance: use create_upload_link for files too large for inline base64, call get_image polling until status reaches completed/already-optimized/failed/cancelled, and split into multiple calls beyond 20 images. Names the alternatives and the conditions that select them rather than leaving routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources