Skip to main content
Glama

Scan a web page

scan_page

Open a web page in a browser on Iminify's servers, collect every image it loads (scrolling to the bottom), and compress each one with the settings given; the finished scan also reports how the page shows its images (get_scan, in audit). It answers straight away with the scan queued; a scan takes from a few seconds to a few minutes, so call get_scan until its status is no longer queued or scanning and images_in_progress is 0. Each scan counts one against the account's daily page scans; the images it finds do not count against its daily images. Pages on private networks are refused, and a page behind a login usually comes back with no images. The page scans reference: https://www.iminify.com/docs/page-scans

Input Schema

NameRequiredDescriptionDefault
urlYesThe page to scan. https:// can be left out.
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.
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 AI alt text for each image the page shows with no alt attribute, for the audit's suggested_alt. On by default; false leaves it out. Each counts against the account's daily AI alt texts.
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.

Output Schema

NameRequiredDescriptionDefault
idNoThe scan's id.
urlNoThe page scanned.
hintNoWhat to do next: poll again while the scan or its images are still running, then where to read its images.
noteNoWhat the scan found, or why it stopped.
auditNoThe page audit: oversized images, missing dimensions and alt text, lazy loading in the wrong place, the largest contentful paint. Null until the scan has finished.
statusNo
skippedNoThe images the scan found and did not compress, each with why.
crawl_idNoThe site crawl this scan is a page of, for get_crawl, or null.
settingsNo
share_urlNoThe page report's public link while it is shared; it answers only while the account is on a paid plan.
created_atNo
updated_atNo
saved_bytesNo
images_countNo
original_sizeNoBytes, over the finished images.
saved_percentNo
optimized_sizeNoBytes, over the finished images.
images_finishedNo
images_in_progressNo
alt_texts_in_progressNoFinished images whose AI alt text for the audit's suggested_alt is still being written.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / share_url / description
      Previous value: -"The page report's public link while it is shared; it answers only while the account has Pro."New value: +"The page report's public link while it is shared; it answers only while the account is on a paid plan."
  2. Changed4 schema fields changed
    • 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."
    • changedOutput schema / properties / audit / properties / images / items / properties / skip_reason / enum
      Previous value: -[
      -  "duplicate",
      -  "unsupported_format",
      -  "too_large",
      -  "tracking_pixel",
      -  "private_network",
      -  "unreadable",
      -  "unreachable",
      -  "refused",
      -  "failed",
      -  null
      -]New value: +[
      +  "duplicate",
      +  "unsupported_format",
      +  "too_large",
      +  "tracking_pixel",
      +  "private_network",
      +  "unreadable",
      +  "unreachable",
      +  "refused",
      +  "failed",
      +  "unchanged",
      +  null
      +]
    • addedOutput schema / properties / crawl_id
      Added value: +{
      +  "description": "The site crawl this scan is a page of, for get_crawl, or null.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / skipped / items / properties / reason / enum
      Previous value: -[
      -  "duplicate",
      -  "unsupported_format",
      -  "too_large",
      -  "tracking_pixel",
      -  "private_network",
      -  "unreadable",
      -  "unreachable",
      -  "refused",
      -  "failed"
      -]New value: +[
      +  "duplicate",
      +  "unsupported_format",
      +  "too_large",
      +  "tracking_pixel",
      +  "private_network",
      +  "unreadable",
      +  "unreachable",
      +  "refused",
      +  "failed",
      +  "unchanged"
      +]
  3. Changed2 schema fields changed
    • changedOutput schema / properties / hint / description
      Previous value: -"What to do next, while the scan or its images are still running."New value: +"What to do next: poll again while the scan or its images are still running, then where to read its images."
    • removedOutput schema / properties / images
      Removed value: -{
      -  "description": "The images the scan found, newest first.",
      -  "items": {
      -    "properties": {
      -      "alt_text": {
      -        "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"
      -        ]
      -      },
      -      "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": {
      -          "format": {
      -            "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"
      -            ]
      -          },
      -          "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",
      -          "format",
      -          "keep_metadata",
      -          "width",
      -          "height",
      -          "scale"
      -        ],
      -        "type": "object"
      -      },
      -      "share_url": {
      -        "description": "Its public page, once shared.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "source_url": {
      -        "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"
      -        ]
      -      },
      -      "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",
      -      "alt_text",
      -      "scan_id",
      -      "source_url",
      -      "share_url",
      -      "created_at",
      -      "updated_at"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
  4. 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."
  5. Changed7 schema fields changed
    • addedInput schema / properties / alt_text
      Added value: +{
      +  "description": "Write an AI alt text for each image the page shows with no alt attribute, for the audit's suggested_alt. On by default; false leaves it out. Each counts against the account's daily AI alt texts.",
      +  "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"
      +}
    • addedOutput schema / properties / alt_texts_in_progress
      Added value: +{
      +  "description": "Finished images whose AI alt text for the audit's suggested_alt is still being written.",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / audit / properties / images / items / properties / suggested_alt
      Added value: +{
      +  "description": "An AI alt text for an image the page shows without one, once written; null while alt_texts_in_progress counts it, or when it was skipped, failed or not asked for.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / audit / properties / images / items / required
      Previous value: -[
      -  "url",
      -  "format",
      -  "bytes",
      -  "natural_width",
      -  "natural_height",
      -  "rendered_width",
      -  "rendered_height",
      -  "above_fold",
      -  "largest_paint",
      -  "alt",
      -  "findings",
      -  "wasted_bytes",
      -  "outcome",
      -  "skip_reason",
      -  "image_id",
      -  "format_sizes"
      -]New value: +[
      +  "url",
      +  "format",
      +  "bytes",
      +  "natural_width",
      +  "natural_height",
      +  "rendered_width",
      +  "rendered_height",
      +  "above_fold",
      +  "largest_paint",
      +  "alt",
      +  "findings",
      +  "wasted_bytes",
      +  "outcome",
      +  "skip_reason",
      +  "image_id",
      +  "format_sizes",
      +  "suggested_alt"
      +]
    • 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"
      +]
  6. Changed1 schema field changed
    • addedOutput schema / properties / share_url
      Added value: +{
      +  "description": "The page report's public link while it is shared; it answers only while the account has Pro.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  7. Changed1 schema field changed
    • addedOutput schema / properties / audit
      Added value: +{
      +  "description": "The page audit: oversized images, missing dimensions and alt text, lazy loading in the wrong place, the largest contentful paint. Null until the scan has finished.",
      +  "properties": {
      +    "bytes": {
      +      "description": "What a browser downloaded for the images listed.",
      +      "type": "integer"
      +    },
      +    "findings": {
      +      "description": "How many images have each finding.",
      +      "properties": {
      +        "eager_below_fold": {
      +          "type": "integer"
      +        },
      +        "lazy_above_fold": {
      +          "type": "integer"
      +        },
      +        "lcp_not_prioritized": {
      +          "type": "integer"
      +        },
      +        "missing_alt": {
      +          "type": "integer"
      +        },
      +        "oversized": {
      +          "type": "integer"
      +        },
      +        "without_dimensions": {
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "oversized",
      +        "without_dimensions",
      +        "lazy_above_fold",
      +        "eager_below_fold",
      +        "missing_alt",
      +        "lcp_not_prioritized"
      +      ],
      +      "type": "object"
      +    },
      +    "formats": {
      +      "description": "How many images arrived in each format, as a browser received them.",
      +      "items": {
      +        "properties": {
      +          "count": {
      +            "type": "integer"
      +          },
      +          "format": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "format",
      +          "count"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "images": {
      +      "description": "Every image address the page had, in the page's order. Only when get_scan is called with audit_images.",
      +      "items": {
      +        "properties": {
      +          "above_fold": {
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "alt": {
      +            "enum": [
      +              "missing",
      +              "empty",
      +              "present",
      +              null
      +            ],
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "bytes": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "findings": {
      +            "items": {
      +              "enum": [
      +                "oversized",
      +                "without_dimensions",
      +                "lazy_above_fold",
      +                "eager_below_fold",
      +                "missing_alt",
      +                "lcp_not_prioritized"
      +              ],
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "format": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "format_sizes": {
      +            "description": "What each format came to when the scan's format was auto.",
      +            "items": {
      +              "properties": {
      +                "bytes": {
      +                  "type": "integer"
      +                },
      +                "format": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "format",
      +                "bytes"
      +              ],
      +              "type": "object"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "image_id": {
      +            "description": "The compressed image, for get_image.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "largest_paint": {
      +            "type": "boolean"
      +          },
      +          "natural_height": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "natural_width": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "outcome": {
      +            "enum": [
      +              "compressed",
      +              "skipped",
      +              "left_out"
      +            ],
      +            "type": "string"
      +          },
      +          "rendered_height": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "rendered_width": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "skip_reason": {
      +            "enum": [
      +              "duplicate",
      +              "unsupported_format",
      +              "too_large",
      +              "tracking_pixel",
      +              "private_network",
      +              "unreadable",
      +              "unreachable",
      +              "refused",
      +              "failed",
      +              null
      +            ],
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "url": {
      +            "type": "string"
      +          },
      +          "wasted_bytes": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "url",
      +          "format",
      +          "bytes",
      +          "natural_width",
      +          "natural_height",
      +          "rendered_width",
      +          "rendered_height",
      +          "above_fold",
      +          "largest_paint",
      +          "alt",
      +          "findings",
      +          "wasted_bytes",
      +          "outcome",
      +          "skip_reason",
      +          "image_id",
      +          "format_sizes"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "images_found": {
      +      "type": "integer"
      +    },
      +    "largest_paint": {
      +      "description": "The largest contentful paint: the biggest thing in the first screen.",
      +      "properties": {
      +        "element": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "kind": {
      +          "enum": [
      +            "image",
      +            "text",
      +            "none"
      +          ],
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "element",
      +        "url"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "oversized_bytes": {
      +      "description": "About how many bytes the oversized images would shed at twice their shown size.",
      +      "type": "integer"
      +    },
      +    "rendered": {
      +      "description": "False when only the page's HTML could be read, so nothing about how images are shown is known.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "rendered",
      +    "images_found",
      +    "largest_paint",
      +    "findings",
      +    "oversized_bytes",
      +    "bytes",
      +    "formats"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  8. 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"
      +]
  9. Changed3 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"
      +]
    • addedOutput schema / properties / skipped
      Added value: +{
      +  "description": "The images the scan found and did not compress, each with why.",
      +  "items": {
      +    "properties": {
      +      "message": {
      +        "type": "string"
      +      },
      +      "reason": {
      +        "enum": [
      +          "duplicate",
      +          "unsupported_format",
      +          "too_large",
      +          "tracking_pixel",
      +          "private_network",
      +          "unreadable",
      +          "unreachable",
      +          "refused",
      +          "failed"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "url",
      +      "reason",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  10. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "created_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "hint": {
      +      "description": "What to do next, while the scan or its images are still running.",
      +      "type": "string"
      +    },
      +    "id": {
      +      "description": "The scan's id.",
      +      "type": "string"
      +    },
      +    "images": {
      +      "description": "The images the scan found, newest first.",
      +      "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"
      +    },
      +    "images_count": {
      +      "type": "integer"
      +    },
      +    "images_finished": {
      +      "type": "integer"
      +    },
      +    "images_in_progress": {
      +      "type": "integer"
      +    },
      +    "note": {
      +      "description": "What the scan found, or why it stopped.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "optimized_size": {
      +      "description": "Bytes, over the finished images.",
      +      "type": "integer"
      +    },
      +    "original_size": {
      +      "description": "Bytes, over the finished images.",
      +      "type": "integer"
      +    },
      +    "saved_bytes": {
      +      "type": "integer"
      +    },
      +    "saved_percent": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "settings": {
      +      "properties": {
      +        "format": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "height": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "keep_metadata": {
      +          "type": "boolean"
      +        },
      +        "level": {
      +          "enum": [
      +            "none",
      +            "lossless",
      +            "ultra",
      +            "smart"
      +          ],
      +          "type": "string"
      +        },
      +        "scale": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "width": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "level",
      +        "format",
      +        "keep_metadata",
      +        "width",
      +        "height",
      +        "scale"
      +      ],
      +      "type": "object"
      +    },
      +    "status": {
      +      "enum": [
      +        "queued",
      +        "scanning",
      +        "completed",
      +        "failed",
      +        "no-image-found",
      +        "cancelled"
      +      ],
      +      "type": "string"
      +    },
      +    "updated_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "url": {
      +      "description": "The page scanned.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  11. First observed

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations: asynchronous queueing, expected duration range, the exact poll-termination condition, that each scan consumes one daily page scan while discovered images do not consume daily images, and that private-network pages are refused and logged-in pages typically return no images. The docs link is a useful escape hatch for deeper reference.

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?

Front-loaded with what the tool does, then workflow, then quota and failure modes, with no filler. A few sentences are long and stack multiple clauses (the login/privacy sentence, the quota sentence), which slightly taxes scanning.

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?

Covers everything an agent needs to call it correctly: async pattern and termination condition, quota implications, expected refusals, and pointer to the reference docs. An output schema exists, so omitting return-shape detail costs nothing.

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

Parameters3/5

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

Schema coverage is 100% and the per-parameter descriptions are already rich (level, scale/width/height interactions, format, alt_text). The tool description adds only the vague phrase 'with the settings given' and no parameter-level guidance of its own, so it holds at the baseline.

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

Purpose4/5

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

States a concrete verb and resource: open a page in a browser, collect every image it loads (scrolling to the bottom), and compress each one. Scope is clearly one page, which implicitly separates it from crawl_site's multi-page job, but it never names crawl_site or compress_images outright, so the sibling differentiation is left to inference.

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

Usage Guidelines4/5

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

Gives explicit follow-up instructions: the call returns immediately with the scan queued, then poll get_scan until status leaves queued/scanning and images_in_progress is 0. It also warns about private networks and login-protected pages, but does not say when to prefer crawl_site over repeated scan_page calls on the same site.

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