Skip to main content
Glama

Start comparison

start_comparison

Free up to 40 pages a day per client address, no key needed; sample report: https://difficat.com/agents/sample/report.json. Compares Site A against Site B on page existence, content and visual regression, priced per page compared. For a migration or redesign check, sourceUrl and targetUrl let discovery pick the pages (maxPages caps them), or urls names the pairs; then wait_for_comparison until it ends and get_report with failedOnly: true. For a single page, use capture_screenshot. dryRun: true answers the page count and price (0.02 USD a page, 0.01 beyond 1000) without charging, and freeCovers without a key; a job above the remaining free allowance is refused with a payment challenge with nextSteps for your human. maxPriceUsd refuses a dearer job before any challenge, never a free job. Example: { "urls": [{ "source": "https://old.example/a", "target": "https://new.example/a" }] }. Answers with jobId, jobToken, status, pagesCharged and, on a free run, sample and allowanceRemaining.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlsNoExplicit page pairs to compare (at most 50000); skips discovery and is priced per pair. One pair is a single-page comparison and needs no sourceUrl.
dryRunNoQuote only: runs every check and the pricing, then answers the page count and exact amount. Nothing is charged, the free allowance is not used and no job starts; the same body without dryRun is priced from the retained result.
visualNoCapture rules applied to both sides.
maxPagesNoOptional ceiling on the pages compared and charged for. The job is priced on the pages it compares: the urls list, or the pages discovery finds, at most this many. There is no page limit.
checkModeNoWhat each page is checked on: full (existence, content and visual, the default), text-only (existence and content, no screenshots) or existence-only (only that every page exists and answers, as for a site translated into another language; content and visual are reported as skipped with reason not-requested).
sourceUrlNoSite A, the reference site (full URL). Required unless urls is given.
targetUrlNoSite B, the migrated site. Omit to capture screenshots of Site A only.
thresholdNoVisual diff tolerance as a fraction from 0 (exact) to 1: 0.05 means 5%. The web app takes a percentage; the API does not.
sitemapUrlNoSitemap to discover pages from.
sourceAuthNoHTTP basic auth for Site A.
targetAuthNoHTTP basic auth for Site B.
callbackUrlNoOptional https URL (port 443) that receives one JSON POST when the job ends (jobId, status, summary, links; never the jobToken), a nudge to read the job. Public hosts only, no redirects followed, retried twice; delivery never affects the job.
maxPriceUsdNoOptional spend cap in USD. A job priced above it is refused before any challenge, so an auto-paying client is never asked for more.
viewportWidthNoCapture width in px.
idempotencyKeyNoOptional opaque string a retry repeats: under a prepaid balance the same value within 24 hours is not charged again and answers DUPLICATE_REQUEST with the jobId of the first call.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
codeNo
errorNo
jobIdNo
amountNo
dryRunNo
sampleNo
statusNo
paymentNo
currencyNo
jobTokenNo
freeCoversNo
pagesPricedNo
pagesChargedNo
allowanceRemainingNo
pagesFromAllowanceNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / visual / properties / freeze / properties / clock / description
      Previous value: -"Pause timers and the clock after load on both sides; a page that waits on a timer to render may stay empty."New value: +"Pause timers and the clock after load; a page that needs a timer to render may stay empty."
    • addedInput schema / properties / visual / properties / freeze / properties / clockSeconds
      Added value: +{
      +  "description": "With clock: seconds the clock runs after load before it stops (1 to 600, default 60).",
      +  "maximum": 600,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / visual / properties / masks / description
      Previous value: -"CSS selectors of elements hidden on both sites before the screenshot (at most 50, each up to 200 characters). The box is kept, so the layout does not shift."New value: +"CSS selectors of elements hidden on both sites before the screenshot (at most 50, each up to 200 characters). The layout keeps its place."
  2. Changed1 schema field changed
    • addedInput schema / properties / visual
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Capture rules applied to both sides.",
      +  "properties": {
      +    "freeze": {
      +      "additionalProperties": false,
      +      "description": "Switches that stop motion before the screenshot.",
      +      "properties": {
      +        "animations": {
      +          "description": "Stop CSS animations and transitions before the screenshot.",
      +          "type": "boolean"
      +        },
      +        "clock": {
      +          "description": "Pause timers and the clock after load on both sides; a page that waits on a timer to render may stay empty.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "masks": {
      +      "description": "CSS selectors of elements hidden on both sites before the screenshot (at most 50, each up to 200 characters). The box is kept, so the layout does not shift.",
      +      "items": {
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / freeCovers
      Added value: +{
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / pagesFromAllowance
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
  5. Changed2 schema fields changed
    • changedInput schema / properties / checkMode / description
      Previous value: -"What each page is checked on: full (existence, content and visual, the default) or text-only (existence and content, no screenshots)."New value: +"What each page is checked on: full (existence, content and visual, the default), text-only (existence and content, no screenshots) or existence-only (only that every page exists and answers, as for a site translated into another language; content and visual are reported as skipped with reason not-requested)."
    • changedInput schema / properties / checkMode / enum
      Previous value: -[
      -  "full",
      -  "text-only"
      -]New value: +[
      +  "full",
      +  "text-only",
      +  "existence-only"
      +]
  6. Changed3 schema fields changed
    • changedInput schema / properties / dryRun / description
      Previous value: -"Quote only: runs every check and the pricing, then answers the page count and exact amount. Nothing is charged, the free sample is not used and no job starts; the same body without dryRun is priced from the retained result."New value: +"Quote only: runs every check and the pricing, then answers the page count and exact amount. Nothing is charged, the free allowance is not used and no job starts; the same body without dryRun is priced from the retained result."
    • changedInput schema / properties / idempotencyKey / description
      Previous value: -"Optional opaque string a retry repeats: under a prepaid key the same value within 24 hours is not charged again and answers DUPLICATE_REQUEST with the jobId of the first call."New value: +"Optional opaque string a retry repeats: under a prepaid balance the same value within 24 hours is not charged again and answers DUPLICATE_REQUEST with the jobId of the first call."
    • addedOutput schema / properties / allowanceRemaining
      Added value: +{
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
  7. Changed5 schema fields changed
    • changedInput schema / properties / callbackUrl / description
      Previous value: -"Optional https URL that receives one JSON POST when the job ends (jobId, status, summary, links; never the jobToken), a nudge to read the job. Public hosts only, no redirects followed, retried twice; delivery never affects the job."New value: +"Optional https URL (port 443) that receives one JSON POST when the job ends (jobId, status, summary, links; never the jobToken), a nudge to read the job. Public hosts only, no redirects followed, retried twice; delivery never affects the job."
    • addedInput schema / properties / checkMode
      Added value: +{
      +  "description": "What each page is checked on: full (existence, content and visual, the default) or text-only (existence and content, no screenshots).",
      +  "enum": [
      +    "full",
      +    "text-only"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / idempotencyKey
      Added value: +{
      +  "description": "Optional opaque string a retry repeats: under a prepaid key the same value within 24 hours is not charged again and answers DUPLICATE_REQUEST with the jobId of the first call.",
      +  "maxLength": 255,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / urls / description
      Previous value: -"Explicit page pairs to compare; skips discovery and is priced per pair. One pair is a single-page comparison and needs no sourceUrl."New value: +"Explicit page pairs to compare (at most 50000); skips discovery and is priced per pair. One pair is a single-page comparison and needs no sourceUrl."
    • addedInput schema / properties / urls / maxItems
      Added value: +50000
  8. Changed5 schema fields changed
    • removedOutput schema / properties / payment / additionalProperties
      Removed value: -false
    • addedOutput schema / properties / payment / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "type": "string"
      +      },
      +      "balance": {
      +        "type": "string"
      +      },
      +      "currency": {
      +        "const": "USD",
      +        "type": "string"
      +      },
      +      "rail": {
      +        "const": "prepaid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "amount",
      +      "currency",
      +      "rail",
      +      "balance"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "allowanceRemaining": {
      +        "type": "number"
      +      },
      +      "amount": {
      +        "type": "string"
      +      },
      +      "currency": {
      +        "const": "USD",
      +        "type": "string"
      +      },
      +      "pagesFromAllowance": {
      +        "type": "number"
      +      },
      +      "rail": {
      +        "const": "subscription",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "amount",
      +      "currency",
      +      "rail",
      +      "pagesFromAllowance",
      +      "allowanceRemaining"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedOutput schema / properties / payment / properties
      Removed value: -{
      -  "amount": {
      -    "type": "string"
      -  },
      -  "balance": {
      -    "type": "string"
      -  },
      -  "currency": {
      -    "const": "USD",
      -    "type": "string"
      -  },
      -  "rail": {
      -    "const": "prepaid",
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / payment / required
      Removed value: -[
      -  "amount",
      -  "currency",
      -  "rail",
      -  "balance"
      -]
    • removedOutput schema / properties / payment / type
      Removed value: -"object"
  9. Changed6 schema fields changed
    • addedInput schema / properties / sourceAuth / properties / password / description
      Added value: +"Password for HTTP basic auth."
    • addedInput schema / properties / sourceAuth / properties / username / description
      Added value: +"Username for HTTP basic auth."
    • addedInput schema / properties / targetAuth / properties / password / description
      Added value: +"Password for HTTP basic auth."
    • addedInput schema / properties / targetAuth / properties / username / description
      Added value: +"Username for HTTP basic auth."
    • addedInput schema / properties / urls / items / properties / source / description
      Added value: +"Page URL on Site A."
    • addedInput schema / properties / urls / items / properties / target / description
      Added value: +"The same page's URL on Site B."
  10. Changed2 schema fields changed
    • addedInput schema / properties / dryRun
      Added value: +{
      +  "description": "Quote only: runs every check and the pricing, then answers the page count and exact amount. Nothing is charged, the free sample is not used and no job starts; the same body without dryRun is priced from the retained result.",
      +  "type": "boolean"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "amount": {
      +      "type": "string"
      +    },
      +    "code": {
      +      "type": "string"
      +    },
      +    "currency": {
      +      "const": "USD",
      +      "type": "string"
      +    },
      +    "dryRun": {
      +      "const": true,
      +      "type": "boolean"
      +    },
      +    "error": {
      +      "type": "string"
      +    },
      +    "jobId": {
      +      "type": "string"
      +    },
      +    "jobToken": {
      +      "type": "string"
      +    },
      +    "pagesCharged": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "pagesPriced": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "payment": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount": {
      +          "type": "string"
      +        },
      +        "balance": {
      +          "type": "string"
      +        },
      +        "currency": {
      +          "const": "USD",
      +          "type": "string"
      +        },
      +        "rail": {
      +          "const": "prepaid",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "amount",
      +        "currency",
      +        "rail",
      +        "balance"
      +      ],
      +      "type": "object"
      +    },
      +    "sample": {
      +      "type": "boolean"
      +    },
      +    "status": {
      +      "const": "running",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  11. Changed1 schema field changed
    • addedInput schema / properties / callbackUrl
      Added value: +{
      +  "description": "Optional https URL that receives one JSON POST when the job ends (jobId, status, summary, links; never the jobToken), a nudge to read the job. Public hosts only, no redirects followed, retried twice; delivery never affects the job.",
      +  "maxLength": 2048,
      +  "minLength": 1,
      +  "type": "string"
      +}
  12. Changed5 schema fields changed
    • addedInput schema / properties / maxPriceUsd
      Added value: +{
      +  "description": "Optional spend cap in USD. A job priced above it is refused before any challenge, so an auto-paying client is never asked for more.",
      +  "exclusiveMinimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / sourceUrl / description
      Previous value: -"Site A, the reference site (full URL)."New value: +"Site A, the reference site (full URL). Required unless urls is given."
    • changedInput schema / properties / threshold / description
      Previous value: -"Visual diff tolerance as a fraction, 0 (exact) to 1."New value: +"Visual diff tolerance as a fraction from 0 (exact) to 1: 0.05 means 5%. The web app takes a percentage; the API does not."
    • changedInput schema / properties / urls / description
      Previous value: -"Explicit page pairs to compare; skips discovery and is priced per pair."New value: +"Explicit page pairs to compare; skips discovery and is priced per pair. One pair is a single-page comparison and needs no sourceUrl."
    • removedInput schema / required
      Removed value: -[
      -  "sourceUrl"
      -]
  13. Changed3 schema fields changed
    • changedInput schema / properties / maxPages / description
      Previous value: -"Optional page cap, 1-500: pay for this many and compare at most this many. Without it (and without urls) the job is priced on the pages discovery finds, capped at 500."New value: +"Optional ceiling on the pages compared and charged for. The job is priced on the pages it compares: the urls list, or the pages discovery finds, at most this many. There is no page limit."
    • changedInput schema / properties / maxPages / maximum
      Previous value: -500New value: +9007199254740991
    • removedInput schema / properties / urls / maxItems
      Removed value: -500
  14. Changed4 schema fields changed
    • changedInput schema / properties / maxPages / description
      Previous value: -"Pages to reserve and pay for, 1-500. The job compares at most this many."New value: +"Optional page cap, 1-500: pay for this many and compare at most this many. Without it (and without urls) the job is priced on the pages discovery finds, capped at 500."
    • changedInput schema / properties / urls / description
      Previous value: -"Explicit page pairs to compare; skips discovery when given."New value: +"Explicit page pairs to compare; skips discovery and is priced per pair."
    • addedInput schema / properties / urls / minItems
      Added value: +1
    • changedInput schema / required
      Previous value: -[
      -  "sourceUrl",
      -  "maxPages"
      -]New value: +[
      +  "sourceUrl"
      +]
  15. 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=false, idempotent=false, openWorld=true). The description adds substantial context those annotations cannot: free allowance of 40 pages/day per client, pricing tiers (0.02 USD/page, 0.01 beyond 1000), that over-allowance jobs are refused with a payment challenge and nextSteps, that maxPriceUsd refuses before any challenge and never affects a free job, and idempotent retry semantics. This is a paid, non-idempotent, open-world operation and the caveats are spelled out.

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 the highest-value facts (free quota, no key needed, sample report) before the mechanics. It is dense and long, and the free/paid policy is repeated across a couple of sentences, but nearly every sentence carries non-obvious operational information an agent needs for a 15-parameter paid tool.

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 complex, paid, asynchronous job-creation tool the description covers cost, quota, refusal paths, idempotency, async follow-up and the response shape (jobId, jobToken, status, pagesCharged, sample, allowanceRemaining). With an output schema present it still adds enough about the return surface to be complete.

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. The description goes beyond by connecting parameters the schema documents in isolation: it explains the urls/sourceUrl/targetUrl interaction, maxPages as the discovery ceiling, dryRun's freeCovers behavior, and supplies a concrete urls example. It stops short of adding format rules or defaults for the remaining fields (threshold, viewport, auth), so it is a moderate enhancement rather than a full one.

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 pair — compares Site A against Site B on page existence, content and visual regression — and explicitly distinguishes itself from the single-page sibling ('For a single page, use capture_screenshot'). An agent can route correctly from the description alone.

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-use guidance for both entry modes (sourceUrl/targetUrl discovery vs. explicit urls pairs) and names the downstream alternatives by tool (wait_for_comparison, get_report with failedOnly: true, capture_screenshot for single pages). It also says when to use dryRun vs. a real run.

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