PicassoWeb
PicassoWeb is a browser-based MCP server that opens websites in Chromium and extracts everything needed to faithfully replicate a page — its design system, assets, layout, motion, and interactive states — and to iteratively pixel-diff a replica against the original until it matches.
Design analysis & inspection:
Analyze a live site (
analyze_site) — extract computed color palette, typography, CSS variables, spacing/radius/shadow primitives, and reusable component families (buttons, cards, navs, modals, etc.).Analyze raw HTML/CSS offline (
analyze_html) — render supplied markup without external requests, useful for generated markup or offline pages.Inspect a component (
inspect_component) — X-ray elements by CSS selector, accessible role/name, or visible text, including shadow roots/iframes, computed styles, cascade rules, pseudo-elements, box-model geometry, and:hover/:focus/:activestates.
Capture & extraction:
Take screenshots (
capture_screenshot) — viewport, full page, or a single element, optionally saved to disk.Download assets (
extract_assets) — images, inline SVGs, fonts, videos, favicons into a local folder with amanifest.jsonmapping each file to its source.Extract layout tree (
extract_layout) — breadth-first layout-focused DOM tree with flex/grid, scroll containers, sticky/fixed positioning, stacking contexts, and section labels.Extract animations (
extract_animations) —@keyframes, transitions, detected libraries (GSAP, Framer Motion, AOS, Lottie), scroll reveals, and paste-ready generated CSS.Record motion over time (
capture_motion) — frame strips, Web Animations API inventory, and numeric transform/opacity curves, catching JS-driven motion like GSAP.Extract responsive behavior (
extract_responsive) — breakpoints, media-query summaries, and layout trees/screenshots at multiple viewport widths.Clone a section (
clone_section) — self-contained HTML+CSS+assets snippet of one section with a screenshot and rewritten URLs for standalone rendering.Capture hidden interactive UI (
capture_interactions) — automatically operate hamburger menus, modals, tabs, accordions, etc., and capture what they reveal.
Site-wide & replication workflows:
Crawl same-origin pages (
crawl_site) — merge pages into a site-wide design system with shared-vs-unique tokens and a page inventory.Create a full replication kit (
create_replication_kit) — desktop + mobile screenshots, assets + manifest,design.json,layout.json,animations.json, and aREPLICATE.mdguide, all in a single page load.
Verification:
Compare a replica (
compare_replica) — anti-aliasing-tolerant YIQ pixel diff of original vs. replica with match percentage, worst regions with coordinates, element-level style deltas, and a visual diff image, plus aselfChecknoise-floor mode to iterate until the copy matches.
Conveniences: Fast repeat analyses via session reuse (2-minute cache), security defaults with SSRF/private-network blocking, opt-in overrides, and easy setup via npx, Docker, or source install.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@PicassoWebanalyze the design of https://example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 a live |
| Render supplied HTML and optional CSS without making external requests. |
| 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 |
| Return a screenshot the client can look at: viewport, full page, or a single element by selector. Optionally saves the image to disk. |
| Download the real images, background images, inline SVG icons/logos, videos, favicons, and web fonts into a local |
| Produce a settled, static motion census: joined |
| 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. |
| 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 |
| 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 how the site adapts across screen sizes: breakpoints derived from |
| One-shot capture of everything, written to a folder: desktop + mobile screenshots, |
| 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 |
| 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 ( |
| 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 |
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 buildConnect 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_htmlblocks 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 buildThe 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.examplePractical 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_componentprovides 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_assetsis a copy tool, not a licensing check.extract_animationsis 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_motionis the complementary dynamic recorder for frame strips, numeric curves, reload/entry motion, and timeline behavior over time.extract_layoutreports stacking-context evidence,z-index, and DOM order, but does not calculate the browser's exact global paint order.capture_motionsamples 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_sitefollowsa[href]links only (SPAs that navigate from click handlers needcapture_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_replicafreezes declarative and WAAPI motion and stubsrequestAnimationFrameafter settling, but the rAF freeze is best-effort; canvas, video, WebGL, timers, and external data can remain nondeterministic. RunselfCheckfirst to measure that page's noise floor.
License
MIT
Available Tools
14 toolsanalyze_htmlAnalyze HTML and CSSARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | Optional CSS to inject into the document. | |
| html | Yes | HTML document or fragment to render. | |
| baseUrl | No | Optional base URL used to resolve relative assets. | |
| timeoutMs | No | ||
| maxElements | No | Maximum DOM elements to analyze. | |
| includeHidden | No | Include elements hidden by CSS or layout. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| maxComponentExamples | No | Example selectors returned for each component type. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 designARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to analyze. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| maxElements | No | Maximum DOM elements to analyze. | |
| includeHidden | No | Include elements hidden by CSS or layout. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. | |
| maxComponentExamples | No | Example selectors returned for each component type. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to explore. | |
| settleMs | No | Wait after each trigger for the revealed UI to settle. | |
| outputDir | No | Absolute directory to save per-interaction screenshots into. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| maxTriggers | No | Maximum interactive triggers to operate. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. | |
| maxInlineScreenshots | No | How many revealed-UI screenshots to return inline as images. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to capture motion from. | |
| samples | No | Number of frames to capture. | |
| trigger | No | What starts the motion: page load (reloads and samples immediately), scrolling, or hover/click on a selector. | load |
| selector | No | Required for hover/click; optional scroll target for the scroll trigger. | |
| outputDir | No | Absolute directory to save all frames into as motion-frame-N.jpg. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| intervalMs | No | Target milliseconds between frames. | |
| maxAnimations | No | Cap on Web Animations API entries returned. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| trackSelectors | No | Extra elements whose computed transform/opacity/filter/clip-path are sampled at every frame. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| maxInlineFrames | No | How many frames to return inline as images. | |
| maxTrackedElements | No | Cap on elements sampled for numeric motion curves. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Observed motion data; frame images are returned as MCP image content. |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 screenshotAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to capture. | |
| mode | No | What to capture. | viewport |
| selector | No | CSS selector, required when mode is 'element'. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| outputPath | No | Absolute file path to also save the image to. | |
| maxHeightPx | No | Full-page captures taller than this are clipped. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Screenshot metadata; binary data is returned as MCP image content. |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to clone from. | |
| selector | Yes | CSS selector for the section to clone. | |
| maxAssets | No | Maximum assets to download when outputDir is set. | |
| outputDir | No | Absolute directory to download the section's assets into (URLs are rewritten to relative paths). | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| maxBytesPerAsset | No | Skip assets larger than this. | |
| includeScreenshot | No | Include a screenshot of the cloned section. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Portable section package; any screenshot is returned as MCP image content. |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 originalARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| fullPage | No | Compare the full page instead of only the viewport. | |
| selfCheck | No | Compare the original with a second fresh load of itself; cannot be combined with a replica source. | |
| threshold | No | Difference threshold. YIQ mode normalizes this legacy 0–765 scale. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| replicaUrl | No | URL of the replica. Provide this or replicaPath. | |
| colorMetric | No | Perceptual YIQ by default; rgbSum exactly reproduces the v0.9 metric. | yiq |
| maxHeightPx | No | Cap on the compared page height. | |
| originalUrl | Yes | Absolute http:// or https:// URL of the original website. | |
| replicaPath | No | Absolute path to a local replica HTML file. Provide this or replicaUrl. | |
| alignSections | No | When page heights diverge, also compare paired top-level sections. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| attributeRegions | No | Attribute worst regions to elements on both pages and report computed-style deltas. | |
| ignoreAntialiasing | No | Exclude detected anti-aliased edge pixels from mismatch counts. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. | |
| allowPrivateReplica | No | Allow localhost/private replica URLs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Visual metrics; the diff is returned as MCP image content. |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// start URL; same-origin links are crawled from here. | |
| maxDepth | No | Maximum link depth from the start URL. | |
| maxPages | No | Maximum pages to load, start page and failed loads included. | |
| outputDir | No | Absolute directory: writes crawl/pages/<slug>/design.json + layout.json (+ viewport.jpg), crawl/site.json, and crawl/SITE.md. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| stripQuery | No | Treat URLs differing only by query string as the same page. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| excludePatterns | No | Glob patterns for paths to skip. Exclude wins over include. | |
| includePatterns | No | Glob patterns ('*' wildcard) a path must match to be crawled. Empty means all paths. | |
| maxLinksPerPage | No | Links harvested per page. | |
| includeScreenshots | No | With outputDir, save a viewport screenshot per page. | |
| maxElementsPerPage | No | DOM elements analyzed per page (lighter than analyze_site). | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to build the kit for. | |
| maxAssets | No | Maximum unique assets to download. | |
| outputDir | Yes | Absolute directory to write the kit into. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| maxElements | No | Maximum DOM elements to analyze. | |
| maxHeightPx | No | Full-page screenshots taller than this are clipped. | |
| maxSvgBytes | No | Skip inline SVGs larger than this. | |
| includeMobile | No | Also capture a mobile-viewport screenshot and layout tree. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| maxBytesPerAsset | No | Skip assets larger than this. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. | |
| mobileViewportWidth | No | Mobile capture width. | |
| mobileViewportHeight | No | Mobile capture height. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Replication-kit paths and summary; the preview is returned as MCP image content. |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 animationsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to analyze. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| maxElements | No | Maximum DOM elements to scan for motion styles. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| interactionStates | No | Reveal transition target values for these forced pseudo states. | |
| maxWaapiAnimations | No | Maximum live Web Animations records to return. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. | |
| includeGeneratedCss | No | Include paste-ready CSS for declared keyframes, animations, and transitions. | |
| includeScrollEffects | No | Scroll the page and report elements whose motion styles change on reveal. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to extract assets from. | |
| types | No | Asset types to include. Empty means all. | |
| maxAssets | No | Maximum unique assets to download. | |
| outputDir | Yes | Absolute directory to write an 'assets/' folder and manifest.json into. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| maxSvgBytes | No | Skip inline SVGs larger than this. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| maxBytesPerAsset | No | Skip assets larger than this. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 treeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to analyze. | |
| maxDepth | No | Maximum tree depth to descend. | |
| maxNodes | No | Maximum nodes to include, consumed breadth-first. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| rootSelector | No | Selector for the subtree root. | body |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 behaviorAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to analyze. | |
| widths | No | Viewport widths to capture layout at. | |
| maxDepth | No | Maximum layout-tree depth per viewport. | |
| maxNodes | No | Maximum layout nodes per viewport. | |
| outputDir | No | Absolute directory to save per-width screenshots into. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll through the page before extraction to trigger lazy-rendered content. | |
| maxScrolls | No | Maximum viewport-sized scroll steps when autoScroll is enabled. | |
| maxHeightPx | No | Screenshots taller than this are clipped. | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 componentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute http:// or https:// URL to inspect. | |
| role | No | Accessible role, for example button or navigation. | |
| text | No | Visible text used with getByText targeting. | |
| roleName | No | Accessible name used with role targeting. | |
| selector | No | Playwright CSS selector; pierces open shadow DOM. | |
| timeoutMs | No | Navigation timeout in milliseconds. | |
| userAgent | No | Optional browser user-agent override. | |
| waitUntil | No | Page lifecycle event to await before extraction. | domcontentloaded |
| autoScroll | No | Scroll before targeting. Defaults off for fast component inspection; a zero-match retry still checks lazy content. | |
| maxMatches | No | Maximum matching elements to return in detail. | |
| maxScrolls | No | Maximum scroll steps when scrolling is needed. | |
| frameSelector | No | Optional iframe selector containing the target. | |
| includeStates | No | Capture :hover, :focus, and :active computed styles via CDP (Chromium). | |
| viewportWidth | No | Browser viewport width in CSS pixels. | |
| viewportHeight | No | Browser viewport height in CSS pixels. | |
| includeBoxModel | No | Include content, padding, border, and margin rectangles. | |
| allowPrivateNetwork | No | Allow localhost and private-network URLs. Enable only for trusted sites. | |
| includeMatchedRules | No | Include matched CSS rules, origins, and resolved custom properties. | |
| includePlatformFonts | No | Include the platform fonts Chromium actually used. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
14 tool updates
v0.10.1- Changed
analyze_html6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "colors", + "typography", + "components", + "tokens", + "primitives", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
analyze_site6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "colors", + "typography", + "components", + "tokens", + "primitives", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
capture_interactions6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "triggersFound", + "interactions", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
capture_motion7 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / descriptionAdded value: +"Observed motion data; frame images are returned as MCP image content." - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "trigger", + "animations", + "frames", + "trackedElements", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
capture_screenshot7 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / descriptionAdded value: +"Screenshot metadata; binary data is returned as MCP image content." - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "mode", + "mimeType", + "bytes", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
clone_section7 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / descriptionAdded value: +"Portable section package; any screenshot is returned as MCP image content." - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "selector", + "html", + "css", + "assets", + "assetRefs", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
compare_replica7 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / descriptionAdded value: +"Visual metrics; the diff is returned as MCP image content." - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "viewport", + "original", + "replica", + "compared", + "matchPercent", + "mismatchedPixels", + "totalPixels", + "worstRegions", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
crawl_site6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "pagesCrawled", + "maxDepthReached", + "pages", + "skipped", + "designSystem", + "files", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
create_replication_kit7 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / descriptionAdded value: +"Replication-kit paths and summary; the preview is returned as MCP image content." - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "outputDir", + "files", + "summary", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
extract_animations6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "keyframes", + "animatedElements", + "scrollReveals", + "libraries", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
extract_assets6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "outputDir", + "assets", + "inlineSvgs", + "skipped", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
extract_layout6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "root", + "nodeCount", + "truncated", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
extract_responsive6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "breakpoints", + "mediaQueries", + "viewports", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
- Changed
inspect_component6 fields changed- added
Output schema / properties / guidanceAdded 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" +} - added
Output schema / properties / result / additionalPropertiesAdded value: +{} - added
Output schema / properties / result / propertiesAdded 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" + } +} - added
Output schema / properties / result / requiredAdded value: +[ + "metadata", + "selector", + "matches", + "elements", + "warnings" +] - added
Output schema / properties / result / typeAdded value: +"object" - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "result", + "guidance" +]
6 tool updates
v0.10.0- Added
capture_motion - Changed
compare_replica8 fields changed- added
Input schema / properties / alignSectionsAdded value: +{ + "default": false, + "description": "When page heights diverge, also compare paired top-level sections.", + "type": "boolean" +} - changed
Input schema / properties / allowPrivateReplica / descriptionPrevious value: -"Allow localhost/private replica URLs (the usual case for a dev server)."New value: +"Allow localhost/private replica URLs." - added
Input schema / properties / attributeRegionsAdded value: +{ + "default": true, + "description": "Attribute worst regions to elements on both pages and report computed-style deltas.", + "type": "boolean" +} - added
Input schema / properties / colorMetricAdded value: +{ + "default": "yiq", + "description": "Perceptual YIQ by default; rgbSum exactly reproduces the v0.9 metric.", + "enum": [ + "rgbSum", + "yiq" + ], + "type": "string" +} - added
Input schema / properties / ignoreAntialiasingAdded value: +{ + "default": true, + "description": "Exclude detected anti-aliased edge pixels from mismatch counts.", + "type": "boolean" +} - changed
Input schema / properties / replicaUrl / descriptionPrevious value: -"URL of the replica, e.g. http://localhost:5173. Provide this or replicaPath."New value: +"URL of the replica. Provide this or replicaPath." - added
Input schema / properties / selfCheckAdded value: +{ + "default": false, + "description": "Compare the original with a second fresh load of itself; cannot be combined with a replica source.", + "type": "boolean" +} - changed
Input schema / properties / threshold / descriptionPrevious 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."
- Added
crawl_site - Changed
extract_animations3 fields changed- added
Input schema / properties / includeGeneratedCssAdded value: +{ + "default": true, + "description": "Include paste-ready CSS for declared keyframes, animations, and transitions.", + "type": "boolean" +} - added
Input schema / properties / interactionStatesAdded value: +{ + "default": [], + "description": "Reveal transition target values for these forced pseudo states.", + "items": { + "enum": [ + "hover", + "focus" + ], + "type": "string" + }, + "maxItems": 2, + "type": "array" +} - added
Input schema / properties / maxWaapiAnimationsAdded value: +{ + "default": 60, + "description": "Maximum live Web Animations records to return.", + "maximum": 200, + "minimum": 1, + "type": "integer" +}
- Changed
extract_layout1 field changed- changed
Input schema / properties / maxNodes / descriptionPrevious value: -"Maximum nodes to include."New value: +"Maximum nodes to include, consumed breadth-first."
- Changed
inspect_component12 fields changed- changed
Input schema / properties / autoScroll / defaultPrevious value: -trueNew value: +false - changed
Input schema / properties / autoScroll / descriptionPrevious 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." - added
Input schema / properties / frameSelectorAdded value: +{ + "description": "Optional iframe selector containing the target.", + "maxLength": 1000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / includeBoxModelAdded value: +{ + "default": true, + "description": "Include content, padding, border, and margin rectangles.", + "type": "boolean" +} - added
Input schema / properties / includeMatchedRulesAdded value: +{ + "default": true, + "description": "Include matched CSS rules, origins, and resolved custom properties.", + "type": "boolean" +} - added
Input schema / properties / includePlatformFontsAdded value: +{ + "default": true, + "description": "Include the platform fonts Chromium actually used.", + "type": "boolean" +} - changed
Input schema / properties / maxScrolls / descriptionPrevious value: -"Maximum viewport-sized scroll steps when autoScroll is enabled."New value: +"Maximum scroll steps when scrolling is needed." - added
Input schema / properties / roleAdded value: +{ + "description": "Accessible role, for example button or navigation.", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / roleNameAdded value: +{ + "description": "Accessible name used with role targeting.", + "maxLength": 500, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the component, for example '.pricing-card' or 'header nav'."New value: +"Playwright CSS selector; pierces open shadow DOM." - added
Input schema / properties / textAdded value: +{ + "description": "Visible text used with getByText targeting.", + "maxLength": 500, + "minLength": 1, + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "url", - "selector" -]New value: +[ + "url" +]
12 tool updates
v0.8.0- First observed
analyze_html - First observed
analyze_site - First observed
capture_interactions - First observed
capture_screenshot - First observed
clone_section - First observed
compare_replica - First observed
create_replication_kit - First observed
extract_animations - First observed
extract_assets - First observed
extract_layout - First observed
extract_responsive - First observed
inspect_component
TDQS
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.
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.
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.
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
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
- miromiroOAuthapp.miromiro
Turn any live website into brand colors, fonts, design tokens, SVGs, Lottie and paste-ready code.
Capture screenshots, detect visual regressions between page versions, and analyze with AI.
Desktop and mobile website screenshots plus page context for AI agents and automation workflows.
UI design from prompts, screenshots, and URLs for AI coding agents and theme tokens.
Related MCP Servers
- FlicenseAqualityDmaintenanceCaptures webpage styles and HTML, converts CSS to Tailwind, and applies extracted designs to frontend frameworks like React.34-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to see, analyze, and visually verify web page changes through pixel-perfect diffing, theme extraction, layout analysis, and interactive element detection.5MIT
- AlicenseNot gradedqualityDmaintenanceExtracts brand identity (colors, typography, spacing) from any website and generates HTML/CSS replicas or applies branding to templates.1MIT
- AlicenseNot gradedqualityBmaintenanceDeterministic screenshot diffing for AI coding agents. Extract design tokens, diff implementations vs reference, get CSS fix suggestions.914MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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