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 "Deploy 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., "@PicassoWeb analyze 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: mcp-mirage-brand-extract
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.
Inputs: html (required), css, baseUrl, timeoutMs, +5 more. Returns: result, guidance
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.
Inputs: url (required), timeoutMs, userAgent, waitUntil, +8 more. Returns: result, guidance
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.
Inputs: url (required), settleMs, outputDir, timeoutMs, +9 more. Returns: result, guidance
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.
Inputs: url (required), samples, trigger, selector, +12 more. Returns: result, guidance
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.
Inputs: url (required), mode, selector, timeoutMs, +9 more. Returns: result, guidance
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.
Inputs: url (required), selector (required), maxAssets, outputDir, +10 more. Returns: result, guidance
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.
Inputs: originalUrl (required), fullPage, selfCheck, threshold, +16 more. Returns: result, guidance
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.
Inputs: url (required), maxDepth, maxPages, outputDir, +14 more. Returns: result, guidance
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.
Inputs: url (required), outputDir (required), maxAssets, timeoutMs, +14 more. Returns: result, guidance
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.
Inputs: url (required), timeoutMs, userAgent, waitUntil, +10 more. Returns: result, guidance
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.
Inputs: url (required), outputDir (required), types, maxAssets, +10 more. Returns: result, guidance
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.
Inputs: url (required), maxDepth, maxNodes, timeoutMs, +8 more. Returns: result, guidance
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.
Inputs: url (required), widths, maxDepth, maxNodes, +10 more. Returns: result, guidance
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.
Inputs: url (required), role, text, roleName, +15 more. Returns: result, guidance
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Each tool is clearly scoped by either target surface (remote page, offline HTML, component, section, site, replica) or evidence type (screenshot, assets, layout, animations, motion, responsive). The descriptions include explicit 'Avoid when' cross-references, so overlapping-sounding tools are easy to tell apart.
All tool names follow a consistent verb_noun snake_case pattern with coherent verb families: analyze_, inspect_, capture_, extract_, clone_, compare_, create_, crawl_. The verb consistently signals the action type and the noun signals the target or output.
14 tools is appropriate for the design-replication domain: the surface covers single-page analysis, targeted extraction, component cloning, interaction capture, responsive comparison, motion capture, site-wide crawling, and full replication. create_replication_kit consolidates the first-pass workflow, keeping the count reasonable.
The toolset provides full coverage of the design extraction and replication lifecycle: analysis, inspection, asset extraction, layout, animation, responsive behavior, interaction capture, cloning, full-package generation, and replica verification. Every tool also lists possible follow-ups, so the workflow has no dead ends.
Maintenance
Related MCP Connectors
Real HTML, styles, measurements and brand tokens from any live site, for coding agents.
Turn any live website into brand colors, fonts, design tokens, SVGs, Lottie and paste-ready code.
DESIGN.md, clone prompts, HTML, screenshots, assets, fonts, colors and tech stack of any website.
See the rendered web: design tokens, fonts, animation timings, WebGL shaders and 3D from any URL.
Related MCP Servers
- 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.8 npmMIT
- AlicenseNot gradedqualityDmaintenanceExtracts brand identity (colors, typography, spacing) from any website and generates HTML/CSS replicas or applies branding to templates.1MIT
- AlicenseAqualityBmaintenanceSearches design platforms for UI references and extracts design tokens such as colors, typography, spacing, and shadows from live websites.5MIT
- AlicenseNot gradedqualityCmaintenanceConverts any rendered web page into a complete, LLM-readable design specification—including block screenshots, distilled computed CSS, design tokens, responsive deltas, and alpha-channel-analyzed assets—so models can accurately reproduce the design.MIT