Skip to main content
Glama

Get a page scan

get_scan
Read-onlyIdempotent

One page scan: where it is, how many images it found and how many are still compressing, the ones it skipped with the reason for each, the totals saved, and, once it has finished, its page report in audit: how many images are oversized, lack width and height or alt text, or are lazy loaded in the wrong place, and the largest contentful paint. Poll this, a few seconds apart, while a scan runs: it is done once its status is no longer queued or scanning and images_in_progress is 0, and its report's suggested_alt texts once alt_texts_in_progress is 0 too. The images themselves are not in this answer, so polling stays small: once images_in_progress is 0, call list_images with scan set to this id for them, a page at a time, with their sizes and download links, or create_zip with scan_id to download every finished one at once. Pass audit_images true, once, after the scan is done, for every image address on the page with what is worth fixing about each; leave it out while polling.

Input Schema

NameRequiredDescriptionDefault
idYesThe scan's id.
audit_imagesNoAdd the page report's entry for every image address on the page (up to 1000). Ask once the scan is done, not while polling.

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. Changed3 schema fields changed
    • 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. Changed5 schema fields changed
    • 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"
      +]
  5. 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"
      +  ]
      +}
  6. Changed2 schema fields changed
    • addedInput schema / properties / audit_images
      Added value: +{
      +  "description": "Add the page report's entry for every image address on the page (up to 1000). Ask once the scan is done, not while polling.",
      +  "type": "boolean"
      +}
    • 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"
      +  ]
      +}
  7. 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"
      +]
  8. 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"
      +}
  9. 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"
      +}
  10. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond that: the poll cadence, the exact termination predicates for status/images_in_progress/alt_texts_in_progress, and the deliberate design choice that image payloads are excluded so polling stays small. That is exactly the context annotations cannot carry.

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?

Return contents are front-loaded and every clause carries real information; there is no filler. It loses a point for form: the opening is a single very long run-on clause chain that is harder to parse than the same content in short sentences or a list.

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?

For a polling read tool with an output schema and full annotation coverage, nothing an agent needs is missing: what comes back, when it is complete, how to poll, and which sibling tool to call next for images or a bulk download. The output schema handles the return shape, and the description fills in the process semantics around it.

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 100%, so the baseline is 3, but the description adds intent the schema cannot: audit_images is for enumerating every image address with what is worth fixing, and must be passed once post-scan rather than during polling. The id parameter is left to the schema, which is acceptable given complete coverage.

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?

States a specific verb+resource (fetch a single page scan) and enumerates exactly what it returns: location, image counts, in-progress count, skipped images with reasons, savings totals, and the page report metrics. It explicitly carves itself away from list_images ('the images themselves are not in this answer'), so an agent can distinguish it from the nearest sibling without opening any schema.

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 operating instructions: poll a few seconds apart, stop when status is not queued/scanning and images_in_progress is 0, wait on alt_texts_in_progress for suggested alts, then hand off to list_images or create_zip. It also states the audit_images condition positively ('once, after the scan is done') and negatively ('leave it out while polling').

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