Skip to main content
Glama

PicassoWeb MCP

"Good artists copy, great artists steal." — the tool formerly known as webcopy-design-mcp.

PicassoWeb opens a website in Chromium and turns its rendered interface into everything an AI client needs to replicate it faithfully. It extracts the actual computed colors, typography, CSS variables, layout primitives, and reusable component families instead of only searching the raw source for CSS strings. Beyond the design system, it can screenshot the page, download the real assets (images, inline SVG logos/icons, fonts, video), extract the motion design (@keyframes, transitions, animation libraries, scroll reveals), capture JS-driven motion over time as frame strips and numeric curves, map the layout tree, clone a section to self-contained HTML + CSS + assets, crawl same-origin pages into a site-wide design system, produce a complete one-shot replication kit, and pixel-diff a replica against the original so an agent can iterate until the copy matches.

Website: blackridder22.github.io/PicassoWeb

Documentation: Introduction · Quick start · Tool reference · Workflows · Security · llms.txt

What it extracts

  • Color palette normalized to hex, with usage counts for text, backgrounds, borders, decoration, SVG fills, and strokes.

  • Font families, weights, styles, type sizes, line heights, letter spacing, and representative selectors.

  • CSS custom properties classified as color, typography, spacing, radius, shadow, or other tokens.

  • Common border radii, box shadows, margins, padding, and gaps.

  • Component families such as buttons, inputs, cards, navigation, headers, footers, modals, tabs, accordions, badges, avatars, forms, tables, heroes, and pagination.

  • Detailed inspection by CSS selector, accessible role/name, or text — including open shadow roots and same-origin frames — with computed styles, matched cascade rules, custom properties, box-model geometry, platform fonts, pseudo-elements, descendants, and interaction states.

JavaScript-rendered pages are supported. By default, the analyzer also scrolls through the page to trigger lazy-rendered sections before extraction.

Related MCP server: websight

MCP tools

Tool

Purpose

analyze_site

Analyze a live http:// or https:// website.

analyze_html

Render supplied HTML and optional CSS without making external requests.

inspect_component

X-ray elements selected by CSS, accessible role/name, or text, optionally inside an iframe. Returns the V1 computed-style data plus matched cascade rules, CSS variables, box-model rectangles, platform fonts, and root/descendant :hover, :focus, and :active changes. Playwright CSS targeting pierces open shadow roots.

capture_screenshot

Return a screenshot the client can look at: viewport, full page, or a single element by selector. Optionally saves the image to disk.

extract_assets

Download the real images, background images, inline SVG icons/logos, videos, favicons, and web fonts into a local assets/ folder with a manifest.json mapping each file to where it appears. Lets a replica reuse the exact original assets instead of re-drawing them.

extract_animations

Produce a settled, static motion census: joined @keyframes and users, numeric timings, a one-shot WAAPI inventory, optional hover/focus transition targets, scroll-timeline detail, detected libraries/reveals, and paste-ready generated CSS. Use capture_motion when the motion must be recorded over time.

extract_layout

Return a breadth-first, layout-focused DOM tree with section labels, flex/grid container and item detail, scroll containers, sticky/fixed positioning, stacking contexts, clipped visible rectangles, opacity-hidden elements, and collapsed-wrapper counts.

clone_section

Return a self-contained copy of one section: cleaned HTML (scripts/handlers stripped, inline SVG preserved, media URLs absolutized), scoped CSS matching that subtree plus the @keyframes/@font-face/:root CSS variables it depends on, its assets, and a screenshot. With outputDir, assets are downloaded and URLs rewritten to relative paths so the snippet renders standalone.

capture_interactions

Find and operate interactive triggers (hamburger menus, dropdowns, modals, tabs, accordions), then capture what they reveal: selectors, bounds, HTML samples, and screenshots taken while the UI is open. Surfaces the parts of a design that never appear in a static extraction.

extract_responsive

Extract how the site adapts across screen sizes: breakpoints derived from @media rules, a summary of each media query (condition, rule count, sample selectors), and a layout tree captured at each requested viewport width — with an optional screenshot per width.

create_replication_kit

One-shot capture of everything, written to a folder: desktop + mobile screenshots, assets/ with manifest, design.json, layout.json (desktop + mobile trees), animations.json, and a REPLICATE.md guide. Loads the page once, so it is much faster than calling the individual tools separately.

compare_replica

Deterministically capture original and replica, then run an anti-aliasing-tolerant YIQ diff. Returns the visual diff, noise-aware counts, worst regions attributed to elements with style deltas, optional section-aligned scores, and a selfCheck mode for measuring the page's own noise floor.

capture_motion

Capture how the page actually moves: a frame-strip of screenshots sampled over time after load, scroll, hover, or click, the Web Animations API inventory (element.animate / CSS animation / transition keyframes, timing, easing, play state), and per-frame numeric transform/opacity curves for animated elements. Catches JS-driven motion (GSAP, Framer Motion) that a static extraction cannot see.

crawl_site

Crawl same-origin pages breadth-first and merge each page's design analysis into a site-wide design system: colors, fonts, and CSS variables shared across pages versus unique to one page, plus a page inventory with section outlines. With outputDir, writes per-page JSON + screenshots and a SITE.md naming the pages worth replicating individually.

All tools return the complete JSON result first for compatibility, plus typed MCP structured content with result and guidance (nextTools, warnings, cost, file behavior, and session policy). capture_screenshot, clone_section, create_replication_kit, compare_replica, capture_interactions, and capture_motion additionally return image content blocks.

Session reuse

Read-style tools (analyze_site, inspect_component, capture_screenshot, extract_assets, extract_animations, extract_layout, clone_section) share a small cache of loaded pages keyed by URL + viewport. Consecutive calls against the same page skip the full navigation — typically 2–5s saved per call — and note the reuse in warnings. Sessions expire after 2 minutes; tools that mutate page state (extract_responsive, create_replication_kit, compare_replica, capture_interactions, capture_motion, crawl_site) always load fresh.

Tools that write files

extract_assets, create_replication_kit, clone_section (with outputDir), extract_responsive (with outputDir), capture_interactions (with outputDir), capture_motion (with outputDir), crawl_site (with outputDir), and capture_screenshot (with outputPath) write to the local filesystem, so they are not marked read-only. Every downloaded asset URL is re-checked against the same SSRF guard as the initial navigation.

Quick start (npx)

Requirements: Node.js 20 or newer. Add PicassoWeb to your MCP client configuration — no clone, no build:

{
  "mcpServers": {
    "picassoweb": {
      "command": "npx",
      "args": ["-y", "picassoweb"]
    }
  }
}

AI tool profiles

full remains the default and advertises all 14 tools. Use the focused workflow profile to advertise only the nine intent-level tools and reduce overlap for agents:

{
  "mcpServers": {
    "picassoweb": {
      "command": "npx",
      "args": ["-y", "picassoweb", "--tools", "workflow"]
    }
  }
}

PICASSOWEB_TOOLS=workflow is equivalent. Both profiles receive workflow routing through MCP server instructions, decision-first tool descriptions, typed output schemas, and machine-readable cost/session metadata.

The same canonical catalog generates the AI tool reference, llms.txt, and packaged PicassoWeb skill, so agent guidance stays version-matched with the server.

The first run downloads the package and a Chromium build (~130 MB, cached after that). If Chromium is already installed, point the server at it instead:

{
  "mcpServers": {
    "picassoweb": {
      "command": "npx",
      "args": ["-y", "picassoweb"],
      "env": { "CHROME_EXECUTABLE_PATH": "/absolute/path/to/chromium" }
    }
  }
}

Install from source

git clone https://github.com/blackridder22/PicassoWeb.git
cd PicassoWeb
npm install          # also downloads Chromium via postinstall
npm run build

Connect an MCP client (from source)

Build the project, then add a stdio server to your MCP client configuration. Replace the example path with the absolute project path.

{
  "mcpServers": {
    "picassoweb": {
      "command": "node",
      "args": ["/absolute/path/to/webcopy-design-mcp/dist/index.js"]
    }
  }
}

During development, the client can launch the TypeScript entry point directly:

{
  "mcpServers": {
    "picassoweb-dev": {
      "command": "npx",
      "args": ["tsx", "/absolute/path/to/webcopy-design-mcp/src/index.ts"]
    }
  }
}

The MCP server communicates over standard input/output. Diagnostic messages are written only to standard error.

Example calls

Analyze a public site:

{
  "url": "https://example.com",
  "viewportWidth": 1440,
  "viewportHeight": 900,
  "maxElements": 2500,
  "autoScroll": true
}

Inspect a component after the overview identifies a useful selector:

{
  "url": "https://example.com",
  "selector": ".pricing-card",
  "maxMatches": 5
}

Targeting can instead use an accessible role/name or visible text, and can be scoped to an iframe. Exactly one of selector, role, or text is required. Component inspection now defaults autoScroll to false; if the target is not initially attached, PicassoWeb performs one lazy-content scroll and retries automatically.

{
  "url": "https://example.com",
  "role": "button",
  "roleName": "Sign in",
  "frameSelector": "iframe.checkout"
}

Analyze source supplied directly by an agent or another tool:

{
  "html": "<main><article class=\"card\"><h2>Hello</h2></article></main>",
  "css": ":root{--brand:#6d5dfc}.card{padding:24px;color:var(--brand)}"
}

Docker

The image uses the official Playwright runtime, so Chromium and its system libraries are already present.

docker build -t picassoweb-mcp .

An MCP client can launch the container as its stdio command:

{
  "mcpServers": {
    "picassoweb": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "picassoweb-mcp"]
    }
  }
}

Security defaults

  • Only HTTP and HTTPS URLs are accepted.

  • Embedded URL credentials are rejected.

  • Localhost, private IP ranges, link-local addresses, and reserved networks are blocked by default.

  • Every browser request is checked, including redirects and subresources.

  • analyze_html blocks external network requests.

  • Input sizes, navigation time, DOM sampling, selector matches, CSS collection, and returned HTML are bounded.

For a trusted local development site, pass "allowPrivateNetwork": true. This should remain disabled when calls can be influenced by untrusted content.

compare_replica is the one exception with a relaxed default: allowPrivateReplica defaults to true so the replica side can point at a localhost dev server or a local file, which is the normal workflow. The original URL is still fully SSRF-guarded.

Development

npm run typecheck
npm test
npm run build

The browser integration test runs when CHROME_EXECUTABLE_PATH is set. The remaining tests validate CSS token extraction, URL safeguards, session caching, and the exposed MCP contract without requiring a browser.

For a full end-to-end smoke test of the built server over real stdio (tool listing, extraction, session-cache speedup, interaction capture, motion sampling, crawling):

npm run build
node scripts/cold-test.mjs            # defaults to https://getbootstrap.com/
node scripts/cold-test.mjs https://your-target.example

Practical limitations

  • Authentication, cookie consent, CAPTCHAs, and anti-bot systems are not bypassed.

  • Content that appears only after a user-specific interaction may require a separate browser automation step before analysis.

  • Computed styles remain available when cross-origin stylesheet rules are inaccessible. Raw CSS variables are additionally recovered from readable stylesheet responses when possible.

  • Component recognition is semantic and heuristic. inspect_component provides the exact follow-up data when a family needs closer analysis.

  • Downloaded assets are the original copyrighted files. Reuse them only where you have the right to; extract_assets is a copy tool, not a licensing check.

  • extract_animations is a static census: its WAAPI data is a one-shot settled snapshot and its scroll-reveal data captures visible start/end values, not the exact JS timeline. capture_motion is the complementary dynamic recorder for frame strips, numeric curves, reload/entry motion, and timeline behavior over time.

  • extract_layout reports stacking-context evidence, z-index, and DOM order, but does not calculate the browser's exact global paint order.

  • capture_motion samples in real wall-clock time (interval floor 100 ms), so very fast animations yield few distinct frames — the per-frame numeric style curves still capture them. GSAP drives elements from its own ticker and never appears in the Web Animations API inventory; its motion shows up in the frame strip and the numeric curves instead.

  • crawl_site follows a[href] links only (SPAs that navigate from click handlers need capture_interactions) and does not consult robots.txt — it is an interactive agent tool with small page caps, not a bulk crawler.

  • Matched rules and forced interaction states use Chromium DevTools Protocol and are therefore Chromium-only. Elements in out-of-process frames can still return evaluate-side inspection data, but CDP-only enrichment may be omitted with a warning.

  • compare_replica freezes declarative and WAAPI motion and stubs requestAnimationFrame after settling, but the rAF freeze is best-effort; canvas, video, WebGL, timers, and external data can remain nondeterministic. Run selfCheck first to measure that page's noise floor.

License

MIT

Available Tools

14 tools
analyze_htmlAnalyze HTML and CSSA
Read-onlyIdempotent

Use this when you need to inspect generated, offline, or test HTML that you already have. Avoid it when the source is a live URL; use analyze_site, inspect_component, or create_replication_kit. Render supplied markup and extract the same design-system data as a remote page analysis. Cost: standard. Session: renders supplied markup without navigating to a remote URL. Does not write files.

ParametersJSON Schema
NameRequiredDescriptionDefault
cssNoOptional CSS to inject into the document.
htmlYesHTML document or fragment to render.
baseUrlNoOptional base URL used to resolve relative assets.
timeoutMsNo
maxElementsNoMaximum DOM elements to analyze.
includeHiddenNoInclude elements hidden by CSS or layout.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
maxComponentExamplesNoExample selectors returned for each component type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond those: it renders supplied markup without navigating to a remote URL, does not write files, and extracts the same design-system data as a remote analysis. No contradiction exists; only a bit more could be said about resource limits, but the provided behavior is sufficient.

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?

The description is front-loaded with the critical scoping and alternatives, and it remains compact for a tool with nine parameters and many siblings. There is minor redundancy ('renders supplied markup' appears twice and 'remote URL' is mentioned more than once), which prevents a perfect score.

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?

Given the nine parameters, rich schema descriptions, output schema presence, and large sibling list, the description covers what is needed: when to use it, when to avoid it, what it processes, side-effect profile, and cost. Return values are not described, but the output schema exists, so the description does not need to explain them.

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 description coverage is high (89%), so the schema already documents most parameters in detail. The description adds little parameter-level meaning beyond the phrase 'Render supplied markup,' which maps to the html parameter. Baseline 3 is appropriate because the schema does the heavy lifting.

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?

The description states a specific action ('inspect', 'render', 'extract design-system data') applied to a clearly defined resource: generated, offline, or test HTML the agent already has. It distinguishes from siblings by explicitly naming live-URL alternatives, so the agent can tell this tool apart without opening schemas.

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?

It gives an explicit when-to-use condition ('generated, offline, or test HTML that you already have') and an explicit when-not-to-use condition ('source is a live URL'), naming analyze_site, inspect_component, and create_replication_kit as alternatives. This is direct routing guidance with no inference required.

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

analyze_siteAnalyze website designA
Read-onlyIdempotent

Use this when you need a design-system overview of one page without creating a replication folder. Avoid it when you need a complete full-page build package; use create_replication_kit once instead. Extract design tokens, typography, CSS variables, primitives, and reusable component families. Cost: standard. Session: uses one browser page for one URL. Does not write files. Possible follow-ups if evidence is still missing: inspect_component, clone_section, extract_responsive.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to analyze.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
maxElementsNoMaximum DOM elements to analyze.
includeHiddenNoInclude elements hidden by CSS or layout.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.
maxComponentExamplesNoExample selectors returned for each component type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior, and the description adds complementary operational details: it uses one browser page for one URL, has standard cost, does not write files, and can lead to follow-up tools if extraction is incomplete. This goes beyond simply restating annotations by explaining session impact and boundary behavior.

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

Conciseness5/5

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

The description is compact and front-loaded, putting the main use case and primary alternative in the first two sentences. The remaining sentences add meaningful behavioral, cost, session, and follow-up context without filler or redundant repetition.

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?

Given a rich output schema, fully documented parameters, and annotations covering safety and idempotency, the description supplies the remaining operational and routing context an agent needs. It does not need to explain return values because an output schema exists, and the key exclusion (create_replication_kit) is explicitly addressed.

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?

The input schema has 100% description coverage across all 12 parameters, including defaults, ranges, and enums, so the schema already carries the semantic load. The description's extraction targets are outputs rather than parameter clarifications, but no parameter remains unexplained and the description does not need to compensate for a coverage gap.

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?

The description uses a specific verb and resource ('design-system overview of one page') and lists concrete extraction targets: design tokens, typography, CSS variables, primitives, and reusable component families. It explicitly distinguishes itself from create_replication_kit by stating it does not create a replication folder, so an agent can tell it apart from siblings.

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?

The description explicitly says when to use it ('design-system overview of one page') and when to avoid it ('complete full-page build package'), naming the alternative create_replication_kit. It also suggests follow-up tools (inspect_component, clone_section, extract_responsive) when evidence is missing, giving the agent clear routing guidance beyond a single binary choice.

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

capture_interactionsCapture hidden interactive UIA

Use this when important UI is hidden behind interactions and you do not yet know its selectors. Avoid it when you already know the target component or need continuous motion sampling. Operate common triggers and capture menus, dialogs, tabs, accordions, and other revealed UI. Cost: heavy. Session: uses one browser page for one URL. May write files when an output path is provided. Possible follow-ups if evidence is still missing: inspect_component, clone_section, capture_motion.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to explore.
settleMsNoWait after each trigger for the revealed UI to settle.
outputDirNoAbsolute directory to save per-interaction screenshots into.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
maxTriggersNoMaximum interactive triggers to operate.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.
maxInlineScreenshotsNoHow many revealed-UI screenshots to return inline as images.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.7/5.0
Behavior5/5

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

The description goes beyond the annotations by disclosing that the operation is cost-heavy, uses one browser page for one URL, and may write files when an output path is provided. This provides practical behavioral context about side effects and resource usage that annotations alone do not convey.

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

Conciseness5/5

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

The description is compact and front-loaded with the primary use case, followed by exclusions, cost, session constraints, and follow-ups. Every sentence contributes new, actionable information without repetition or filler.

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 tool with 13 parameters, the description fairly covers what it does, when to use it, when to avoid it, cost implications, file-writing side effects, session constraints, and likely follow-ups. An output schema exists, so return-value details are already covered elsewhere.

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 description coverage is 100%, so the input schema already documents all 13 parameters with meaningful descriptions. The tool description adds overall context but does not need to add parameter-level semantics because the schema fully covers that responsibility.

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?

The description states a specific action and resource: capturing UI that is hidden behind interactions and whose selectors are unknown. It also names concrete UI types such as menus, dialogs, tabs, and accordions, and the sibling tool capture_motion is explicitly contrasted, making the tool's purpose unmistakable.

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?

It gives an explicit when-to-use rule ('when important UI is hidden behind interactions and you do not yet know its selectors'), an explicit when-not-to-use rule ('when you already know the target component or need continuous motion sampling'), and names follow-up alternatives like inspect_component, clone_section, and capture_motion.

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

capture_motionCapture motion over timeA

Use this when you need to observe actual motion, especially JS-driven animation. Avoid it when declared CSS and WAAPI definitions are sufficient; use extract_animations. Sample frames, live animations, and numeric style curves after load, scroll, hover, or click. Cost: heavy. Session: uses one browser page for one URL. May write files when an output path is provided. Possible follow-ups if evidence is still missing: inspect_component, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to capture motion from.
samplesNoNumber of frames to capture.
triggerNoWhat starts the motion: page load (reloads and samples immediately), scrolling, or hover/click on a selector.load
selectorNoRequired for hover/click; optional scroll target for the scroll trigger.
outputDirNoAbsolute directory to save all frames into as motion-frame-N.jpg.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
intervalMsNoTarget milliseconds between frames.
maxAnimationsNoCap on Web Animations API entries returned.
viewportWidthNoBrowser viewport width in CSS pixels.
trackSelectorsNoExtra elements whose computed transform/opacity/filter/clip-path are sampled at every frame.
viewportHeightNoBrowser viewport height in CSS pixels.
maxInlineFramesNoHow many frames to return inline as images.
maxTrackedElementsNoCap on elements sampled for numeric motion curves.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesObserved motion data; frame images are returned as MCP image content.
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: 'Cost: heavy', 'uses one browser page for one URL', and 'May write files when an output path is provided'. These details disclose side effects and resource impact not captured by the annotation flags, without contradicting them.

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

Conciseness5/5

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

The description is compact and front-loaded with the primary use case, followed by the exclusion, behavior, cost, session model, and follow-ups. Every sentence adds useful decision-making or safety information with no filler.

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 16-parameter tool with an output schema and open-world implications, the description covers the essential operational context: heavy cost, single-page session, file-writing side effect, trigger types, and follow-ups. Nothing critical is missing for an agent to decide and use the tool effectively.

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 description coverage is 100%, so the input schema already documents every parameter thoroughly. The description contributes high-level context like triggers and output files, but does not need to compensate for schema gaps. Baseline 3 applies.

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?

The description states a specific purpose: observe actual motion, especially JS-driven animation, and sample frames, live animations, and numeric style curves. It explicitly distinguishes itself from extract_animations, so an agent can select between siblings without opening schemas.

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?

It gives explicit when-to-use ('Use this when you need to observe actual motion'), when-to-avoid ('Avoid it when declared CSS and WAAPI definitions are sufficient; use extract_animations'), and names likely follow-ups. This is direct routing guidance with no ambiguity.

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

capture_screenshotCapture website screenshotA
Idempotent

Use this when you only need visual evidence or a reference image of a page or element. Avoid it when you need the full implementation package; create_replication_kit already includes screenshots. Capture a viewport, full page, or selected element as an image the agent can inspect. Cost: light. Session: uses one browser page for one URL. May write files when an output path is provided. Possible follow-ups if evidence is still missing: inspect_component, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to capture.
modeNoWhat to capture.viewport
selectorNoCSS selector, required when mode is 'element'.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
outputPathNoAbsolute file path to also save the image to.
maxHeightPxNoFull-page captures taller than this are clipped.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesScreenshot metadata; binary data is returned as MCP image content.
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond that: cost level, one browser page per URL, and the fact that files may be written when an output path is provided. It does not contradict the annotations and provides enough extra operational context.

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

Conciseness5/5

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

The description is compact and front-loaded with the most important decision guidance (when to use vs. avoid). The cost, session, and follow-up statements are each useful and do not waste words. It is structured so an agent can quickly parse selection criteria before invocation details.

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?

Given the rich input schema and the presence of an output schema, the description covers all the essential decision-making context: intended use, exclusions, side effects, resource usage, and follow-up alternatives. An agent has enough information to select and invoke this tool correctly without guessing.

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 description coverage is 100%, so the input schema already fully documents all 13 parameters. The description mentions capture modes and file output, but those are already reflected in the schema. It adds no meaningfully new parameter information, so the baseline score of 3 is appropriate.

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?

The description states a concrete action and resource: capture a website screenshot as visual evidence or reference image. It also distinguishes the tool from create_replication_kit, which is a key sibling differentiator. This is far beyond a vague restatement of the tool name.

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?

It explicitly says when to use the tool ('when you only need visual evidence or a reference image') and when to avoid it ('when you need the full implementation package; create_replication_kit already includes screenshots'). It also suggests possible follow-ups when evidence is still missing, which helps an agent decide among siblings.

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

clone_sectionClone a website sectionA

Use this when you need a portable implementation package for one known section. Avoid it when you need an entire page; use create_replication_kit. Return cleaned HTML, scoped CSS, dependencies, assets, and an optional screenshot for one section. Cost: standard. Session: uses one browser page for one URL. May write files when an output path is provided. Possible follow-ups if evidence is still missing: capture_motion, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to clone from.
selectorYesCSS selector for the section to clone.
maxAssetsNoMaximum assets to download when outputDir is set.
outputDirNoAbsolute directory to download the section's assets into (URLs are rewritten to relative paths).
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
maxBytesPerAssetNoSkip assets larger than this.
includeScreenshotNoInclude a screenshot of the cloned section.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesPortable section package; any screenshot is returned as MCP image content.
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate the tool is not read-only, and the description adds concrete behavioral detail beyond that: 'May write files when an output path is provided,' 'uses one browser page for one URL,' and 'Cost: standard.' This gives the agent useful cost and side-effect context that the annotations alone do not convey.

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

Conciseness5/5

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

The description is compact and front-loaded with the most important decision info: use case, exclusions, return contents, cost, session constraints, and follow-ups. Every sentence contributes actionable guidance with no filler.

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 tool with 14 parameters, the description covers scope, return artifacts, side effects, cost, session behavior, and follow-up tools, while the output schema and 100% parameter coverage handle the remaining details. Nothing essential to correct invocation is missing.

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 description coverage is 100%, so the schema already documents all 14 parameters. The description mentions 'an optional screenshot' and 'output path,' which lightly reinforce two parameters, but it does not need to add much parameter-level detail given the schema's completeness.

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?

The description names a specific verb and resource: producing a 'portable implementation package for one known section.' It explicitly contrasts with create_replication_kit for entire pages, which makes the tool's scope immediately distinguishable from a sibling.

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?

The description gives direct when-to-use guidance ('when you need a portable implementation package for one known section') and an explicit when-not-to-use instruction with a named alternative ('Avoid it when you need an entire page; use create_replication_kit'). It also suggests relevant follow-up tools, giving an agent a clear decision path.

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

compare_replicaCompare replica against originalA
Read-onlyIdempotent

Use this when a replica exists and you need evidence-driven visual verification or a same-page noise-floor check. Avoid it when you have not implemented a replica yet. Run a deterministic perceptual diff and attribute the worst visual mismatches to elements and styles. Cost: heavy. Session: loads the original and comparison target. Does not write files. Possible follow-ups if evidence is still missing: inspect_component.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullPageNoCompare the full page instead of only the viewport.
selfCheckNoCompare the original with a second fresh load of itself; cannot be combined with a replica source.
thresholdNoDifference threshold. YIQ mode normalizes this legacy 0–765 scale.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
replicaUrlNoURL of the replica. Provide this or replicaPath.
colorMetricNoPerceptual YIQ by default; rgbSum exactly reproduces the v0.9 metric.yiq
maxHeightPxNoCap on the compared page height.
originalUrlYesAbsolute http:// or https:// URL of the original website.
replicaPathNoAbsolute path to a local replica HTML file. Provide this or replicaUrl.
alignSectionsNoWhen page heights diverge, also compare paired top-level sections.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
attributeRegionsNoAttribute worst regions to elements on both pages and report computed-style deltas.
ignoreAntialiasingNoExclude detected anti-aliased edge pixels from mismatch counts.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.
allowPrivateReplicaNoAllow localhost/private replica URLs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesVisual metrics; the diff is returned as MCP image content.
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds genuinely useful behavioral context beyond those annotations: the operation is heavy, the session loads both the original and the comparison target, it does not write files, and it performs deterministic perceptual diffing. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: usage conditions first, then behavior, then cost/session side effects, then follow-up guidance. Every sentence earns its place with no redundancy or filler.

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?

Despite high complexity—20 parameters and an output schema—the description covers the essential context an agent needs: when to call it, what it does, its cost, side effects, and a fallback tool. Since an output schema exists, the description does not need to explain return values. No critical gaps remain.

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 description coverage is 100%, so the input schema already documents all 20 parameters with meaningful descriptions. The tool description adds high-level framing, such as perceptual diffing and worst-mismatch attribution, but does not need to repeat parameter-level detail. Baseline 3 is appropriate.

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?

The description clearly states a specific verb and resource: compare a replica against an original via a deterministic perceptual diff and attribute visual mismatches. It also names the same-page noise-floor self-check mode, which distinguishes this tool from any sibling that merely captures or inspects a page.

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?

Explicitly says when to use it ('when a replica exists and you need evidence-driven visual verification or a same-page noise-floor check') and when to avoid it ('Avoid it when you have not implemented a replica yet'). It also suggests a follow-up tool, inspect_component, when evidence is still missing.

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

crawl_siteCrawl a site's design systemA

Use this when the goal spans several pages and you need shared versus page-specific design patterns. Avoid it when one page is the target; analyze or create a kit for that page instead. Merge design evidence from bounded same-origin pages into a site-wide system and page inventory. Cost: heavy. Session: loads several bounded same-origin pages. May write files when an output path is provided. Possible follow-ups if evidence is still missing: create_replication_kit.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// start URL; same-origin links are crawled from here.
maxDepthNoMaximum link depth from the start URL.
maxPagesNoMaximum pages to load, start page and failed loads included.
outputDirNoAbsolute directory: writes crawl/pages/<slug>/design.json + layout.json (+ viewport.jpg), crawl/site.json, and crawl/SITE.md.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
stripQueryNoTreat URLs differing only by query string as the same page.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
excludePatternsNoGlob patterns for paths to skip. Exclude wins over include.
includePatternsNoGlob patterns ('*' wildcard) a path must match to be crawled. Empty means all paths.
maxLinksPerPageNoLinks harvested per page.
includeScreenshotsNoWith outputDir, save a viewport screenshot per page.
maxElementsPerPageNoDOM elements analyzed per page (lighter than analyze_site).
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=false and destructiveHint=false. The description adds genuinely useful behavioral context: the operation is heavy, loads several bounded same-origin pages, may write files when an output path is provided, and might require follow-up tools. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

Four compact sentences, with the most decision-relevant guidance (when to use, when to avoid) front-loaded. The cost, session scope, side effects, and follow-up routing are each stated in a single phrase with no filler or redundancy.

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 tool with 18 parameters and an output schema, the description covers what an agent needs to decide and invoke correctly: use-case boundary, scope limits, write behavior, cost, and next steps. The heavy lifting on parameters is done by the fully documented schema.

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 description coverage is 100%, so the input schema fully documents all 18 parameters. The description adds only broad context about bounded same-origin crawling and conditional file output, which slightly reinforces but does not materially extend the parameter documentation. Baseline 3 is appropriate.

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?

The description states a specific verb ('crawl'), a clear resource ('a site's design system'), and the exact purpose: identifying shared versus page-specific design patterns across several pages. It also distinguishes itself from single-page tools by explicitly saying to avoid it when one page is the target.

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?

The description gives explicit when-to-use ('goal spans several pages'), when-not-to-use ('one page is the target'), and names alternatives ('analyze or create a kit for that page instead'). It even names create_replication_kit as a possible follow-up, which is strong routing guidance.

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

create_replication_kitCreate a full replication kitA

Use this when you need a broad first-pass package for reproducing a complete page. Avoid it when you only need one component, one screenshot, or a quick design overview. Write screenshots, assets, design data, layout trees, animations, and a replication guide in one pass. Cost: heavy. Session: captures one URL at multiple viewport states. May write files when an output path is provided. Replaces these separate first-pass calls: analyze_site, capture_screenshot, extract_assets, extract_layout. Possible follow-ups if evidence is still missing: extract_responsive, extract_animations, capture_motion, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to build the kit for.
maxAssetsNoMaximum unique assets to download.
outputDirYesAbsolute directory to write the kit into.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
maxElementsNoMaximum DOM elements to analyze.
maxHeightPxNoFull-page screenshots taller than this are clipped.
maxSvgBytesNoSkip inline SVGs larger than this.
includeMobileNoAlso capture a mobile-viewport screenshot and layout tree.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
maxBytesPerAssetNoSkip assets larger than this.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.
mobileViewportWidthNoMobile capture width.
mobileViewportHeightNoMobile capture height.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesReplication-kit paths and summary; the preview is returned as MCP image content.
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already communicate non-read-only and open-world behavior, and the description adds meaningful context by noting it may write files, is cost-heavy, and captures one URL at multiple viewport states. It does not detail overwrite behavior or auth requirements, but the annotations plus this description cover the essential safety and side-effect profile.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: selection guidance, explicit exclusions, outputs, cost, side effects, replaced tools, and possible follow-ups. The most important usage guidance is front-loaded, and nothing feels redundant or wasted.

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 18-parameter composite tool with an output schema, the description provides complete context: when to use it, when to avoid it, what it produces, what side effects it has, which siblings it replaces, and what to try next if evidence is missing. No critical selection or invocation context is absent.

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 description coverage is 100%, with all 18 parameters already well documented. The description adds a small amount of interpretive context, such as single-URL and multi-viewport behavior, but does not need to restate parameter details. This matches the baseline for full schema 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?

The description clearly defines the tool's purpose: creating a broad first-pass replication kit for a complete page, with an explicit list of outputs such as screenshots, assets, design data, layout trees, animations, and a replication guide. It also distinguishes this tool from narrower alternatives like single-component extraction or screenshot capture, so an agent can identify it without opening the 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?

The description gives explicit when-to-use guidance ('broad first-pass package for reproducing a complete page') and when-not-to-use guidance ('one component, one screenshot, or a quick design overview'). It also names the exact sibling tools this replaces and lists possible follow-up tools, leaving little to inference.

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

extract_animationsExtract website animationsA
Read-onlyIdempotent

Use this when you need static motion definitions and replication-ready CSS. Avoid it when you need to observe JS-driven movement over time; use capture_motion. Extract declared keyframes, transitions, timings, scroll effects, WAAPI records, and generated CSS. Cost: standard. Session: uses one browser page for one URL. Does not write files. Possible follow-ups if evidence is still missing: capture_motion, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to analyze.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
maxElementsNoMaximum DOM elements to scan for motion styles.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
interactionStatesNoReveal transition target values for these forced pseudo states.
maxWaapiAnimationsNoMaximum live Web Animations records to return.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.
includeGeneratedCssNoInclude paste-ready CSS for declared keyframes, animations, and transitions.
includeScrollEffectsNoScroll the page and report elements whose motion styles change on reveal.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description adds useful operational context: standard cost, one browser page per URL, no file writes, and a limitation note about missing evidence. This goes beyond the structured metadata and matches the annotations.

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

Conciseness5/5

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

The description is concise and well-structured: usage guidance is front-loaded, followed by extraction scope, then operational constraints and follow-up tools. Every sentence earns its place without redundancy.

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?

Despite the tool's 14 parameters, the schema and output schema cover the technical details, and the description covers purpose, exclusions, operational limits, and follow-up paths. An agent has everything needed for correct selection and invocation.

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 description coverage is 100%, so the description is not responsible for documenting individual parameters. It references output categories like generated CSS and WAAPI records that map to includeGeneratedCss and maxWaapiAnimations, but it does not add parameter-level meaning beyond what the schema already provides.

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?

The description opens with a specific verb and resource: extracting static motion definitions and replication-ready CSS. It enumerates concrete artifacts (keyframes, transitions, timings, scroll effects, WAAPI records, generated CSS) and explicitly distinguishes itself from capture_motion, so an agent can disambiguate without reading schemas.

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 an explicit when-to-use condition, an explicit avoidance condition, and names the correct alternative (capture_motion). It also lists possible follow-up tools if evidence is missing, providing complete routing guidance.

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

extract_assetsExtract website assetsA

Use this when you specifically need the original asset files from one page. Avoid it when you are starting a full-page replica; create_replication_kit already downloads assets. Download original images, SVGs, fonts, videos, favicons, and backgrounds with a usage manifest. Cost: standard. Session: uses one browser page for one URL. May write files when an output path is provided. Possible follow-ups if evidence is still missing: clone_section, create_replication_kit.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to extract assets from.
typesNoAsset types to include. Empty means all.
maxAssetsNoMaximum unique assets to download.
outputDirYesAbsolute directory to write an 'assets/' folder and manifest.json into.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
maxSvgBytesNoSkip inline SVGs larger than this.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
maxBytesPerAssetNoSkip assets larger than this.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

It discloses the non-read-only behavior ('May write files when an output path is provided'), resource cost ('standard'), and session scope ('uses one browser page for one URL'), going beyond the annotations. The annotations mark readOnlyHint=false, so there is no contradiction.

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

Conciseness5/5

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

The description is compact and front-loaded: usage guidance, exclusion of the sibling, asset list, cost/session/side effects, and follow-ups each earn their place in a few short sentences. No filler.

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?

Given the 14-parameter schema with full coverage, an output schema, and non-conflicting annotations, the description supplies the remaining selection context: single-page scope, write behavior, cost, session resources, and suggested follow-up tools. An agent has what it needs to select and invoke the tool correctly.

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 description coverage is 100%, so the input schema already documents every parameter including formats, defaults, and outputDir's manifest behavior. The description adds only a general 'original asset files' frame and repeats categories already present in the types enum, neither of which adds much beyond the schema.

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?

The description opens with a specific verb+resource: download original asset files from one page, and explicitly lists the asset categories and a usage manifest. It also names create_replication_kit as the sibling that is not this tool, so an agent can distinguish them.

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?

It states exactly when to use ('when you specifically need the original asset files from one page') and when to avoid ('when starting a full-page replica'), naming create_replication_kit as the alternative that already downloads assets. It also lists clone_section and create_replication_kit as follow-ups for missing evidence.

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

extract_layoutExtract website layout treeA
Read-onlyIdempotent

Use this when you specifically need structural geometry for a page or subtree. Avoid it when you need a full replication package or multiple viewport widths. Return a bounded layout tree with sections, scroll containers, positioning, stacking, grid, and flex detail. Cost: standard. Session: uses one browser page for one URL. Does not write files. Possible follow-ups if evidence is still missing: inspect_component, extract_responsive.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to analyze.
maxDepthNoMaximum tree depth to descend.
maxNodesNoMaximum nodes to include, consumed breadth-first.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
rootSelectorNoSelector for the subtree root.body
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds useful context beyond these: it uses one browser page per URL, does not write files, has standard cost, and returns a bounded tree. There is no contradiction with the annotations.

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

Conciseness5/5

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

The description is compact and appropriately front-loaded: it opens with when to use, follows with when to avoid, then states output characteristics, cost, session usage, file behavior, and follow-ups. Every sentence contributes useful routing or behavioral information with no redundancy.

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 12-parameter tool with a rich input schema, an output schema, and safety annotations, the description covers the remaining decision-relevant context: when to choose it, what it returns at a high level, side effects (no writes, single page), cost class, and next steps. Nothing essential for correct invocation is missing.

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 description coverage is 100%, so the input schema already documents all 12 parameters thoroughly. The description adds little parameter-specific detail, but it reinforces the notion of a subtree (matching rootSelector) and bounded output (matching maxDepth/maxNodes), which is sufficient given the schema's completeness.

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?

The description clearly states the tool extracts structural geometry (a bounded layout tree with sections, scroll containers, positioning, stacking, grid, and flex detail) for a page or subtree. It explicitly contrasts this with full replication packages and multiple-viewport needs, distinguishing it from sibling tools like extract_responsive and create_replication_kit.

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?

It gives an explicit 'Use this when' condition and an 'Avoid it when' exclusion, naming the exact scenarios that should route elsewhere (full replication package, multiple viewport widths). It also lists concrete follow-up tools (inspect_component, extract_responsive) when evidence is still missing.

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

extract_responsiveExtract responsive behaviorA
Idempotent

Use this when you need breakpoints and concrete layout changes across screen sizes. Avoid it when one viewport is enough or a complete kit with desktop and mobile captures is the goal. Compare media rules and layout trees across requested viewport widths, with optional screenshots. Cost: heavy. Session: captures one URL at multiple viewport states. May write files when an output path is provided. Possible follow-ups if evidence is still missing: inspect_component, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to analyze.
widthsNoViewport widths to capture layout at.
maxDepthNoMaximum layout-tree depth per viewport.
maxNodesNoMaximum layout nodes per viewport.
outputDirNoAbsolute directory to save per-width screenshots into.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll through the page before extraction to trigger lazy-rendered content.
maxScrollsNoMaximum viewport-sized scroll steps when autoScroll is enabled.
maxHeightPxNoScreenshots taller than this are clipped.
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.7/5.0
Behavior5/5

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

Adds meaningful behavioral context beyond the annotations: 'Cost: heavy', 'captures one URL at multiple viewport states', 'May write files when an output path is provided', and possible follow-ups. Annotations already provide readOnly/idempotent/destructive hints, and the description enriches them with operational details without contradiction.

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

Conciseness5/5

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

Every sentence earns its place: purpose, exclusions, function, cost/session/side effects, and follow-ups. It is front-loaded with the intended use case and keeps the operational caveats compact.

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?

With an output schema present and 100% parameter coverage, the description covers purpose, usage boundaries, cost, side effects, and follow-up paths. Nothing critical for correct tool selection or invocation is missing.

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 description coverage is 100%, so the baseline is 3. The description only references 'output path' and 'requested viewport widths' without adding any meaning beyond the schema's parameter descriptions. It neither improves nor harms parameter understanding.

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 'Compare' with a concrete resource ('media rules and layout trees') and clarifies scope ('across requested viewport widths'). It also differentiates from siblings by telling the agent to avoid it for single-viewport or full-kit needs and names follow-up tools (inspect_component, compare_replica).

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?

Explicitly says when to use ('when you need breakpoints and concrete layout changes'), when not to use ('Avoid it when one viewport is enough or a complete kit...'), and provides alternative follow-ups if evidence is missing. This is clear routing guidance.

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

inspect_componentInspect website componentA
Read-onlyIdempotent

Use this when you need an exact style and state X-ray of a known element, role, or text target. Avoid it when you need portable HTML, scoped CSS, assets, and a screenshot; use clone_section. Return targeted computed styles, cascade rules, variables, box geometry, fonts, and interaction states. Cost: light. Session: uses one browser page for one URL. Does not write files. Possible follow-ups if evidence is still missing: clone_section, capture_motion, compare_replica.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute http:// or https:// URL to inspect.
roleNoAccessible role, for example button or navigation.
textNoVisible text used with getByText targeting.
roleNameNoAccessible name used with role targeting.
selectorNoPlaywright CSS selector; pierces open shadow DOM.
timeoutMsNoNavigation timeout in milliseconds.
userAgentNoOptional browser user-agent override.
waitUntilNoPage lifecycle event to await before extraction.domcontentloaded
autoScrollNoScroll before targeting. Defaults off for fast component inspection; a zero-match retry still checks lazy content.
maxMatchesNoMaximum matching elements to return in detail.
maxScrollsNoMaximum scroll steps when scrolling is needed.
frameSelectorNoOptional iframe selector containing the target.
includeStatesNoCapture :hover, :focus, and :active computed styles via CDP (Chromium).
viewportWidthNoBrowser viewport width in CSS pixels.
viewportHeightNoBrowser viewport height in CSS pixels.
includeBoxModelNoInclude content, padding, border, and margin rectangles.
allowPrivateNetworkNoAllow localhost and private-network URLs. Enable only for trusted sites.
includeMatchedRulesNoInclude matched CSS rules, origins, and resolved custom properties.
includePlatformFontsNoInclude the platform fonts Chromium actually used.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
guidanceYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnly, openWorld, idempotent, and non-destructive behavior. The description adds meaningful context beyond those: 'Cost: light,' 'Session: uses one browser page for one URL,' 'Does not write files,' and follow-up routing. This is more than the bare safety profile, though it could be more specific about rate limits or output-count behavior; no contradiction exists.

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

Conciseness5/5

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

Four sentences with no filler. The purpose is front-loaded, the alternative is given immediately, return values are listed compactly, and cost/session/file-write/follow-up notes each earn their place. Efficient and well-structured.

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?

Given 19 parameters, 13 siblings, rich annotations, and an output schema, the description is complete enough: it defines scope, names the main alternative, states what is returned, clarifies session/cost/side effects, and suggests follow-ups. The output schema handles return details, so nothing critical is missing for selecting and invoking the tool correctly.

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 description coverage is 100%, so the baseline is 3. The main description does not add parameter-level detail beyond what each schema property already states, though it does reinforce the targeting concept ('element, role, or text target') that maps to role/text/roleName/selector. This is adequate but not exceptional.

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?

The description leads with a specific verb and resource: 'exact style and state X-ray of a known element, role, or text target.' It also enumerates concrete return values (computed styles, cascade rules, variables, box geometry, fonts, interaction states) and explicitly differentiates from clone_section, so an agent can distinguish it from siblings without opening the 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?

The description gives an explicit when-to-use ('Use this when you need an exact style and state X-ray') and a when-not-to-use with a named alternative ('Avoid it when you need portable HTML, scoped CSS, assets, and a screenshot; use clone_section'). It also lists possible follow-up tools if evidence is missing, which further guides selection.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 14 tool updatesv0.10.1
    • Changedanalyze_html6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "analyze_html",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "colors": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "components": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "primitives": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "tokens": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "typography": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "colors",
        +  "typography",
        +  "components",
        +  "tokens",
        +  "primitives",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedanalyze_site6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "analyze_site",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "colors": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "components": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "primitives": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "tokens": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "typography": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "colors",
        +  "typography",
        +  "components",
        +  "tokens",
        +  "primitives",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedcapture_interactions6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "capture_interactions",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "interactions": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "triggersFound": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "triggersFound",
        +  "interactions",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedcapture_motion7 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "capture_motion",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / description
        Added value: +"Observed motion data; frame images are returned as MCP image content."
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "animations": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "frames": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "trackedElements": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "trigger": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "trigger",
        +  "animations",
        +  "frames",
        +  "trackedElements",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedcapture_screenshot7 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "capture_screenshot",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / description
        Added value: +"Screenshot metadata; binary data is returned as MCP image content."
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "bytes": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "mimeType": {
        +    "type": "string"
        +  },
        +  "mode": {
        +    "enum": [
        +      "viewport",
        +      "fullPage",
        +      "element"
        +    ],
        +    "type": "string"
        +  },
        +  "savedPath": {
        +    "type": "string"
        +  },
        +  "selector": {
        +    "type": "string"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "mode",
        +  "mimeType",
        +  "bytes",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedclone_section7 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "clone_section",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / description
        Added value: +"Portable section package; any screenshot is returned as MCP image content."
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "assetRefs": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "assets": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "css": {
        +    "type": "string"
        +  },
        +  "html": {
        +    "type": "string"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "selector": {
        +    "type": "string"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "selector",
        +  "html",
        +  "css",
        +  "assets",
        +  "assetRefs",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedcompare_replica7 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "compare_replica",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / description
        Added value: +"Visual metrics; the diff is returned as MCP image content."
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "aaPixels": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "compared": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "determinismCheck": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "matchPercent": {
        +    "type": "number"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "mismatchedPixels": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "original": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "replica": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "sections": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "totalPixels": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "viewport": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "worstRegions": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "viewport",
        +  "original",
        +  "replica",
        +  "compared",
        +  "matchPercent",
        +  "mismatchedPixels",
        +  "totalPixels",
        +  "worstRegions",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedcrawl_site6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "crawl_site",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "designSystem": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "files": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "maxDepthReached": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "outputDir": {
        +    "type": "string"
        +  },
        +  "pages": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "pagesCrawled": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "skipped": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "pagesCrawled",
        +  "maxDepthReached",
        +  "pages",
        +  "skipped",
        +  "designSystem",
        +  "files",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedcreate_replication_kit7 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "create_replication_kit",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / description
        Added value: +"Replication-kit paths and summary; the preview is returned as MCP image content."
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "files": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "outputDir": {
        +    "type": "string"
        +  },
        +  "summary": {
        +    "additionalProperties": {},
        +    "properties": {},
        +    "type": "object"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "outputDir",
        +  "files",
        +  "summary",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedextract_animations6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "extract_animations",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "animatedElements": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "generatedCss": {
        +    "type": "string"
        +  },
        +  "keyframes": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "libraries": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "scrollReveals": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "stateTransitions": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "waapiAnimations": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "keyframes",
        +  "animatedElements",
        +  "scrollReveals",
        +  "libraries",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedextract_assets6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "extract_assets",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "assets": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "inlineSvgs": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "outputDir": {
        +    "type": "string"
        +  },
        +  "skipped": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "outputDir",
        +  "assets",
        +  "inlineSvgs",
        +  "skipped",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedextract_layout6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "extract_layout",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "nodeCount": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "root": {
        +    "anyOf": [
        +      {
        +        "additionalProperties": {},
        +        "properties": {},
        +        "type": "object"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ]
        +  },
        +  "truncated": {
        +    "type": "boolean"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "root",
        +  "nodeCount",
        +  "truncated",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedextract_responsive6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "extract_responsive",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "breakpoints": {
        +    "items": {
        +      "type": "number"
        +    },
        +    "type": "array"
        +  },
        +  "mediaQueries": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "viewports": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "breakpoints",
        +  "mediaQueries",
        +  "viewports",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
    • Changedinspect_component6 fields changed
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "cost": {
        +      "enum": [
        +        "light",
        +        "standard",
        +        "heavy"
        +      ],
        +      "type": "string"
        +    },
        +    "nextTools": {
        +      "description": "Candidate follow-ups; do not call them automatically or in parallel.",
        +      "items": {
        +        "enum": [
        +          "analyze_site",
        +          "analyze_html",
        +          "inspect_component",
        +          "capture_screenshot",
        +          "extract_assets",
        +          "extract_animations",
        +          "extract_layout",
        +          "clone_section",
        +          "capture_interactions",
        +          "extract_responsive",
        +          "compare_replica",
        +          "create_replication_kit",
        +          "capture_motion",
        +          "crawl_site"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "sessionPolicy": {
        +      "enum": [
        +        "offline-document",
        +        "single-url",
        +        "multi-viewport",
        +        "dual-page",
        +        "site-crawl"
        +      ],
        +      "type": "string"
        +    },
        +    "summary": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "tool": {
        +      "const": "inspect_component",
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal limitations or incomplete evidence from this run.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "writesFiles": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "summary",
        +    "nextTools",
        +    "warnings",
        +    "cost",
        +    "writesFiles",
        +    "sessionPolicy"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / result / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / result / properties
        Added value: +{
        +  "elements": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "matches": {
        +    "maximum": 9007199254740991,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "analyzedAt": {
        +        "type": "string"
        +      },
        +      "finalUrl": {
        +        "type": "string"
        +      },
        +      "requestedUrl": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "requestedUrl",
        +      "finalUrl",
        +      "title",
        +      "analyzedAt"
        +    ],
        +    "type": "object"
        +  },
        +  "selector": {
        +    "type": "string"
        +  },
        +  "warnings": {
        +    "description": "Non-fatal limitations or incomplete evidence from this run.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / result / required
        Added value: +[
        +  "metadata",
        +  "selector",
        +  "matches",
        +  "elements",
        +  "warnings"
        +]
      • addedOutput schema / properties / result / type
        Added value: +"object"
      • changedOutput schema / required
        Previous value: -[
        -  "result"
        -]New value: +[
        +  "result",
        +  "guidance"
        +]
  2. 6 tool updatesv0.10.0
    • Addedcapture_motion
    • Changedcompare_replica8 fields changed
      • addedInput schema / properties / alignSections
        Added value: +{
        +  "default": false,
        +  "description": "When page heights diverge, also compare paired top-level sections.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / allowPrivateReplica / description
        Previous value: -"Allow localhost/private replica URLs (the usual case for a dev server)."New value: +"Allow localhost/private replica URLs."
      • addedInput schema / properties / attributeRegions
        Added value: +{
        +  "default": true,
        +  "description": "Attribute worst regions to elements on both pages and report computed-style deltas.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / colorMetric
        Added value: +{
        +  "default": "yiq",
        +  "description": "Perceptual YIQ by default; rgbSum exactly reproduces the v0.9 metric.",
        +  "enum": [
        +    "rgbSum",
        +    "yiq"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / ignoreAntialiasing
        Added value: +{
        +  "default": true,
        +  "description": "Exclude detected anti-aliased edge pixels from mismatch counts.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / replicaUrl / description
        Previous value: -"URL of the replica, e.g. http://localhost:5173. Provide this or replicaPath."New value: +"URL of the replica. Provide this or replicaPath."
      • addedInput schema / properties / selfCheck
        Added value: +{
        +  "default": false,
        +  "description": "Compare the original with a second fresh load of itself; cannot be combined with a replica source.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / threshold / description
        Previous value: -"Per-pixel RGB delta (sum of channel differences) above which a pixel counts as mismatched."New value: +"Difference threshold. YIQ mode normalizes this legacy 0–765 scale."
    • Addedcrawl_site
    • Changedextract_animations3 fields changed
      • addedInput schema / properties / includeGeneratedCss
        Added value: +{
        +  "default": true,
        +  "description": "Include paste-ready CSS for declared keyframes, animations, and transitions.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / interactionStates
        Added value: +{
        +  "default": [],
        +  "description": "Reveal transition target values for these forced pseudo states.",
        +  "items": {
        +    "enum": [
        +      "hover",
        +      "focus"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 2,
        +  "type": "array"
        +}
      • addedInput schema / properties / maxWaapiAnimations
        Added value: +{
        +  "default": 60,
        +  "description": "Maximum live Web Animations records to return.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedextract_layout1 field changed
      • changedInput schema / properties / maxNodes / description
        Previous value: -"Maximum nodes to include."New value: +"Maximum nodes to include, consumed breadth-first."
    • Changedinspect_component12 fields changed
      • changedInput schema / properties / autoScroll / default
        Previous value: -trueNew value: +false
      • changedInput schema / properties / autoScroll / description
        Previous value: -"Scroll through the page before extraction to trigger lazy-rendered content."New value: +"Scroll before targeting. Defaults off for fast component inspection; a zero-match retry still checks lazy content."
      • addedInput schema / properties / frameSelector
        Added value: +{
        +  "description": "Optional iframe selector containing the target.",
        +  "maxLength": 1000,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / includeBoxModel
        Added value: +{
        +  "default": true,
        +  "description": "Include content, padding, border, and margin rectangles.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / includeMatchedRules
        Added value: +{
        +  "default": true,
        +  "description": "Include matched CSS rules, origins, and resolved custom properties.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / includePlatformFonts
        Added value: +{
        +  "default": true,
        +  "description": "Include the platform fonts Chromium actually used.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / maxScrolls / description
        Previous value: -"Maximum viewport-sized scroll steps when autoScroll is enabled."New value: +"Maximum scroll steps when scrolling is needed."
      • addedInput schema / properties / role
        Added value: +{
        +  "description": "Accessible role, for example button or navigation.",
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / roleName
        Added value: +{
        +  "description": "Accessible name used with role targeting.",
        +  "maxLength": 500,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the component, for example '.pricing-card' or 'header nav'."New value: +"Playwright CSS selector; pierces open shadow DOM."
      • addedInput schema / properties / text
        Added value: +{
        +  "description": "Visible text used with getByText targeting.",
        +  "maxLength": 500,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "url",
        -  "selector"
        -]New value: +[
        +  "url"
        +]
  3. 12 tool updatesv0.8.0
    • First observedanalyze_html
    • First observedanalyze_site
    • First observedcapture_interactions
    • First observedcapture_screenshot
    • First observedclone_section
    • First observedcompare_replica
    • First observedcreate_replication_kit
    • First observedextract_animations
    • First observedextract_assets
    • First observedextract_layout
    • First observedextract_responsive
    • First observedinspect_component

TDQS

A4.6/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose, reinforced by explicit use/avoid guidance and follow-up suggestions. Even similar tools like analyze_site and analyze_html are cleanly separated by input source, while create_replication_kit is clearly framed as the consolidated alternative to several granular first-pass tools.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: analyze, inspect, capture, extract, clone, compare, create, crawl. The verbs also cluster semantically with their targets, making the naming predictable and easy to scan.

Tool Count5/5

With 14 tools, the set is well-scoped for a web design extraction and replication server. The count is justified because each tool targets a distinct analysis, extraction, creation, or verification step, and create_replication_kit consolidates common first-pass work rather than making the set feel bloated.

Completeness4/5

The toolkit covers the full evidence-gathering and replication workflow: analyze, inspect, extract, clone, generate a full kit, compare, and crawl. The main gap is that after compare_replica identifies mismatches, there is no update/repair tool to fix an existing replica, forcing the agent to re-clone or hand-edit instead of closing the loop directly.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/blackridder22/PicassoWeb'

If you have feedback or need assistance with the MCP directory API, please join our Discord server