awwwards-mcp
A free, open-source MCP server that gives AI agents Awwwards design inspiration — and capture, analysis, rebuild and verification tooling that runs on any URL.
Search & discovery: find award-winning sites by color, tag, technology, award type or free text (
search_sites), browse curated collections, the agency directory and the full filter taxonomy.Design DNA: fetch a site's palette, stack, elements, awards and description (single or batch of 10), compare 2–3 sites, and synthesize a cited design brief from 2–5 references.
Elements: search the cached UI-component corpus (footers, heroes, loaders…) and pull a site's component-level visuals with poster images and video URLs.
Annual Awards: list categories, nominees and full nominee details from Awwwards' official public API (reference-only media).
Page analysis on any URL: section band maps with desktop↔mobile diff, scroll-motion census (triggers, scrub/pin, easing, choreography), hover census, motion DNA, stack fingerprint, design tokens, component packs and image-delivery audit.
Captures: full-page screenshots (incl. inner-scroller anchor mode), motion recordings with filmstrips and evidence sheets, WebGL pose grids and 3D scene evidence packs with optional Three/Spector adapters.
Forensics & audits: bundle grep with import graph, offline HAR API-surface extraction, runtime performance evidence, accessibility evidence, and authorized-asset downloading with rights recording.
Build tooling: convert a single-file rebuild into a Vite/Astro/Next.js project, and generate runnable GSAP, motion-manifest and three.js scaffold stubs from captured evidence.
Verification: score a build against a reference (band structure + motion fingerprint), compare step-aligned interaction flows, and run an opt-in pixel-level 3D gate on canvas builds.
Monitoring & offline data: poll new winners, watch studios/tags/sites, search cached motion records, and read local index status and aggregate stats.
Provides tools for searching Awwwards award-winning websites by color, tags, technology, award type, or free-text query; viewing site screenshots; and extracting design DNA such as color palettes, technologies, design elements, and award history. Can also capture, analyze, and record motion of live sites for design inspiration.
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., "@awwwards-mcp Find dark 3D portfolio sites and summarize their design DNA."
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.
awwwards-mcp
Free, open-source MCP server that gives AI agents design inspiration from Awwwards — the Mobbin-style visual reference loop, sourced from the web's best award-winning websites.
Your agent searches in natural language ("dark 3D portfolio sites", "soft pastel
e-commerce"), sees real screenshots inline, and pulls the design DNA of any
site: color palette, tech stack, design elements, award history. Then it goes past
inspiration: point it at any link and it band-maps the page, censuses scroll and
hover motion (keyframes, measured scrub curves), fingerprints the framework, captures
canvas pose grids, and reads the site's bundles when a mechanism is unclear. From that
evidence it recreates the page section by section, then converts the build into a
runnable Vite, Astro or Next.js project with a measured motion manifest and
per-section hooks. Close the loop with verify_build (band + motion scoring,
measured perf) and generate GSAP timelines from the captured motion.
And it's not just Awwwards websites — every capture, census, and verification tool runs on any URL. Just give it any site link and tell it to recreate: band-map it, study its motion, rebuild section by section, and score your build against the original.
Free-text queries run on a porter-stemmed, prefix-matching FTS5 index with BM25 ranking — "magazines" now finds Magazine-tagged sites (68 on the live index), best matches first, where the old substring path returned zero. Multi-word queries keep AND semantics: every token must hit the same site.
Tools
Tool | What it does |
| Search by color, tags, technology, award type or free-text query; e.g. |
| Design DNA for one site: palette, technologies, elements, awards, description. Batch ( |
| Compare 2–3 sites' design DNA and jury scores as text-only JSON. Uses cached details or fetches missing detail pages. |
| Turn 2–5 selected site slugs plus a required project goal into a deterministic, cited build brief. Uses cached detail/element evidence and cached Motion DNA first, fetches only missing details, returns Markdown plus versioned JSON, and runs browser band analysis only with |
| Read local index count, crawl progress, last success/error, lock state and freshness without network requests. |
| Aggregate metrics over the local cache only (zero network). All-time: site count, gallery element count ( |
| Component-level visuals for one site: each element's poster image inline (3D models, video content, mobile layouts, microcopy…) + video URLs. |
| Every filter the agent can search by (200+ tags, 27 colors). A legacy cache without technology facets is refreshed on read; if that refresh fails the response sets |
| Browse Awwwards' curated and member collections. No slug lists collections (paginated, ~32 per page, |
| Browse the Awwwards directory of agencies, studios and freelancers: name, profile slug, location, website and award counts. Filters are path-based ( |
| Official Annual Awards categories (Site of the Year, Agency of the Year, …) with nominee counts from Awwwards' public read-only API. Nominee details hydrate on request. Personal, non-commercial inspiration use; media URLs are reference-only. |
| Nominees in one Annual Awards category, hydrated on demand at 1 request/second (default 10, max 20). Site summaries include |
| One Annual Awards nominee in full — site: date, description, designBy, country, images/videos; agency: location, avatar, award tag counts, featured projects. Accepts a UUID, a full |
| Optional: fresh full-page screenshot of any live URL. Waits for |
| Section band map of any page (live URL or local file:// build): tag, background, offset, height per band. Detects the real scroll container when the page pins |
| Optional: short motion-through video of a live URL — preloader, scroll-triggered and hover/cursor animations. Returns an inline filmstrip JPEG plus the saved .webm path. |
| Search the element corpus (footer, hero, pricing, 404…) by free text: cached |
| One element record: title, category, author, built-with stack, related elements and its media URL (image or video) pointing at awwwards' CDN. |
| Runtime motion fingerprint of a live URL: animation libraries, render engines, ScrollTrigger stats (trigger count, scrub ratio), tween easing/duration vocab and the scroll model. Fresh capture or cached capture with timestamp. |
| Per-element scroll-motion census of any URL: selector path, trigger source (gsap-scrolltrigger / native css scroll & view timelines / data-attr / css-keyframe / SMIL), animated props, duration, easing, scrub/pin flags and SVG stroke draw-ins — the rebuild recipe an agent can wire straight into GSAP timelines. Optional |
| Hover-interaction census: extracts |
| Bundle forensics for a live page: fetches the page once, downloads its script chunks (script tags, inline scripts, and modulepreload/preload-as-script hints; bounded: ≤40 chunks / 10MB / 1 request/second), saves + hashes them locally, optionally de-obfuscates with webcrack if installed, and greps keywords across the code — chunk paths + match lines so an agent can read the actual animation mechanism instead of guessing. Optional |
| Offline API-surface evidence from a local HAR 1.2 file (a browser DevTools export): requests grouped by method + origin + path template (dates, versions, UUIDs, hex ids and numbers templated; emails, tokens and long high-entropy segments redacted), with counts, statuses, content types and query names only. Reads the file only - never fetches recorded URLs and never returns bodies, headers or query values. 20 MB / 2000-entry caps; |
| Runtime + static performance evidence for any live URL — never a grade. Runtime: installed Chrome/Edge over raw CDP (no playwright) measures fps, dropped frames, long tasks/animations and layout thrash ( |
| Accessibility evidence from a live page — explicitly not a WCAG pass/fail. Samples up to |
| Convert a single-file exact rebuild (any local |
| Score a build against a reference site: band-map compare (Dice score) + motion-fingerprint diff (trigger mix, scrub/pin, easing vocabulary, native scroll timelines) → 0–100 score, pass/warn/fail verdict and evidence lines. |
| Step-aligned interaction-flow comparison: runs the same 1–6 scroll/click/wait steps on a build and a reference URL (two fresh headless launches, desktop or mobile) and compares path, scroll delta, skeleton hash, text hash and element count after each step. |
| Optional: serialize one page component (CSS selector, default |
| Deterministic design-token export from one computed-style capture: colors, typography, spacing, radii, shadows and borders as ordinal CSS variables ( |
| Image-delivery evidence for a live page: totals by format, |
| Hero canvas reference frames → |
| Two strict ops. |
| Pose grid → offline three.js+GSAP replay skeleton. Renders a |
| Fingerprint any page's stack from one polite HTML fetch (no browser): framework (Next.js/Astro/Nuxt/Remix/SvelteKit/WordPress/Webflow/Framer), CSS framework (Tailwind/Bootstrap) with marker lists and honest confidence, plus a |
| Captured motion evidence → runnable single-file GSAP+ScrollTrigger stub: one timeline per scroll-census anim (trigger, |
| Build a |
| Offline Vite + Three.js scaffold from a |
| Search previously captured motion-DNA scans by library, scroll model or easing vocabulary — find references by how a site moves. |
| Poll today's freshly-crowned winners (SOTD / Developer Award / Honorable Mention) against a persisted baseline. First call seeds the baseline and reports the current listing count (no element backfill); later calls report the delta. Each winner first reported after the baseline poll is backfilled into the searchable element corpus from its site page when reachable; failed per-winner fetches are not retried. |
| Persistent watches over studios, tags or specific sites (add/list/remove). |
Routing
You want | Use |
Sites matching filters or free text |
|
Curated inspiration boards |
|
Agencies, studios or freelancers |
|
Annual Awards categories, nominees or one nominee |
|
Design DNA for one site, or compact enrichment for a shortlist |
|
Performance evidence for one URL |
|
A scored build-vs-reference comparison |
|
Accessibility evidence for a live page |
|
Section bands and desktop↔mobile changes |
|
API calls a page makes |
|
Did my build keep an interaction flow? |
|
compact:true is the summary mode for heavy tools — audit_url,
verify_build, analyze_scroll_map, analyze_hover_census and
capture_component return a summary payload with less detail, and each shape
differs: the scroll/hover censuses reduce to counts, capture_component drops
per-node styles/text/svg/anims (the tag/classes/rect tree, fonts and colors
stay; typography/palette summaries are full-mode only), and verify_build
keeps verdict,
overall, bands and motion top-level while dropping buildUrl,
referenceUrl and evidence (bands holds counts); a requested scene3d
block is kept whole because it carries its own verdict. audit_url keeps its
top-level keys but reduces perf and antiPatterns.
Batch detail is get_site_details { slugs }, capped at 10: results stay in
input order, carry compact details only (no images), and report per-slug
cached/fetched/error/skipped status. analyze_page_structure with
compare: "mobile" returns responsive evidence alongside mobileBands/diff
— page overflow, small text and small tap targets at 390×844 — evidence, not a
score.
Opt-in Three adapter
capture_scene_3d can add an experimental, opt-in Three.js adapter to an
op:"capture" request:
{ "request": { "op": "capture", "url": "https://example.com", "adapters": ["three"] } }v2 uses the same field inside the scene branch:
capture_page {request:{kind:"scene", op:"capture", url, adapters:["three"]}}.
The adapter reads only objects reachable after load from window.THREE,
window.scene/camera/renderer/controls, and
window.app/experience/viewer/world (including those holders'
scene/camera/renderer/controls fields). It installs no hooks, makes no
network requests and never crawls the heap. A scene held only in a module
closure is invisible, so absence is not evidence of absence.
The pack gains evidence.three (three-adapter-v1) only when the adapter was
requested: available, reason, revision, scene.nodes (≤500 nodes, depth
20, with truncated and total), camera plus cameras (≤8), lights (≤8),
controls, and coverage for scene, geometry, camera, controls, lights and
materials. Nodes carry type,
name, uuid, visibility, parent-relative position/quaternion/scale, child count,
geometry (type, attributes, index count, bounds and numeric constructor
parameters), and material/camera/light records. Materials are capped at 32 and
texture references at 200; texture URLs are redacted to origin+pathname, and a
material's map also carries the inventory assetId when the URL matches a
resource row. coverage reflects what was actually observed: a requested
adapter that finds nothing leaves capabilities unknown, not available.
build_scene_stub reconstructs the supported subset from evidence.three:
Meshes only for Box, Plane, Sphere and Cylinder geometry, using captured numeric dimensions where present. A missing or out-of-range dimension falls back to an authored
1and is listed inunresolved; other geometry types are skipped and listed.Materials only as
MeshStandardMaterialorMeshBasicMaterial. Other types fall back to standard and are listed; a multi-material mesh keeps only its first material.A captured
PerspectiveCamerais applied from its exactmatrixWorldonly whenfov/near/farand an affine matrix validate; otherwise the authored camera stays and the gap is listed. The captured camera is static — no idle orbit — withmatrixAutoUpdateandmatrixWorldAutoUpdateoff. Controls are never recreated: OrbitControls is not wired, because its TRS update can move a sheared or non-orthogonal pose, so any captured controls are listed inunresolved. With no captured camera, the scaffold keeps the authored camera; the idle orbit is used only when the pack has no usable adapter scene.Captured lights are recorded but not applied; lighting and background stay authored defaults. The scaffold never reads or executes captured shader source or
userData.modeisreconstructed-subsetfor a model binding or at least one supported adapter mesh; otherwiseplaceholder. Textures bind only throughassetBindings: without a local image bound to the texture'sassetId, the material keeps its flat colour and the gap is listed.
Honest limits: module-local scenes are invisible; captured node transforms are parent-relative and the stub flattens meshes at the scene root, so parent transforms are lost; texture binding is local-only; and missing nodes are not evidence of absence.
Opt-in Spector adapter
capture_scene_3d also accepts "spector" in the same adapters array. An
op:"capture" request may use it alone or with "three" (at most two entries,
no duplicates):
{ "request": { "op": "capture", "url": "https://example.com", "adapters": ["spector"] } }v2 uses the same field inside the scene branch:
capture_page {request:{kind:"scene", op:"capture", url, adapters:["spector"]}}.
spectorjs@0.9.33 is an optional dependency. When it is installed, its local
dist/spector.bundle.js (about 1.19 MB) is read from disk and injected as an
init script before navigation, so its WebGL spies exist before the page creates
a context. The bundle is never fetched over the network, its UI is not shown,
and worker contexts are not captured. When the package is absent, the adapter
is recorded as unavailable with the install hint
npm install --save-optional spectorjs@0.9.33; the rest of the capture still
runs. A probe timeout or error likewise degrades only the adapter and never
fails the scene pack. The bundle is injected once per capture that requests it.
evidence.spector (spector-adapter-v1) records a compact summary of one
captured WebGL frame:
context: WebGL version and up to 16 context attributes.commands: total, draw-call count, up to 30 command names by frequency, and status counts (unknown,unused,disabled,redundant,valid,deprecated).up to 8 programs, each with
LINK_STATUS,VALIDATE_STATUS, an info log, and shader source; up to 16 shaders total.shader source is capped at 64 Ki characters per shader and 256 Ki characters total, with
lengthandtruncatedpreserving the original size.up to 8 analyses (8 keys each), canvas dimensions, adapter
limitsand truncation flags.no command arguments, command results, GL state, stack traces, memory or raw capture is transferred into Node.
Shader source is untrusted page text: it is bounded, stored as data and never
executed. coverage.capabilities.shaders is available only when at least one
shader source was captured; a spector request that captured none leaves it
unknown, while capture without any adapter leaves it unavailable.
Honest limits: one frame is captured per request. A page that has stopped
drawing can yield no draw calls and therefore no programs; the adapter still
returns context and command evidence with an empty programs array. Command
arguments, results, state, stack and memory are deliberately absent, so the
summary cannot explain why a draw call differs — only what was submitted.
Opt-in 3D verify gate
verify_build takes an optional scene3d block for canvas/WebGL builds. It
replays the checkpoints of one capture_scene_3d pack against the build page in
a fresh browser and compares each clipped canvas frame pixel-by-pixel.
{
"buildUrl": "https://preview.example.com",
"referenceUrl": "https://reference.example.com",
"scene3d": {
"referenceCaptureId": "scene-mg2k3j4p-0123abcd",
"buildSelector": "#scene",
"tolerances": { "pixelThreshold": 0.05, "maxChangedFraction": 0.02 }
}
}Field | Meaning |
| Pack id from a |
| CSS selector for the build's |
| Per-channel normalized delta (0–1) above which a pixel counts as changed; default 0 while no verdict is issued. |
| Maximum share of changed pixels (0–1) for the pair to stay within tolerance. |
| Accepted camera-angle delta in degrees (0–180). Only used when the reference pack carries a comparable camera angle; neither |
Both pixelThreshold and maxChangedFraction are required for a
within-tolerance or outside-tolerance verdict. When either is missing,
comparable checkpoints still report changedPixelFraction and
meanAbsoluteChannelError, but the verdict is inconclusive.
Before any legacy structure, scroll, hover or perf scan, a requested scene3d
creates one DNS/private-IP guard and loopback proxy and checks the reference and
build URLs against it. The same proxy carries the legacy acquisitions and the
anti-pattern HTML read. If either URL is not http(s) or resolves to a
loopback, link-local, private, metadata or reserved address, the run makes zero
requests and returns an unavailable report with an inconclusive scene3d block.
scene3d.status (comparable / inconclusive) and scene3d.verdict
(within-tolerance / outside-tolerance / inconclusive) are separate from
the top-level overall and verdict. The legacy pass never certifies a canvas,
and the 3D gate never changes the legacy score. compact: true keeps the
scene3d block whole. A pass requires every requested checkpoint to be
comparable; one blocking reason forces the whole gate to inconclusive, never a
partial pass.
Artifacts: build and diff PNGs are written under
<cache>/scene-captures/<referenceCaptureId>/verify/<run>/; referenceImage
points at the pack frame, and red marks changed pixels while dimmed grey marks
unchanged ones. An artifact write failure is reported in limitations and
blocks a within/outside verdict. A verify path that is a symlink/junction, or
that cannot be created, makes the whole gate inconclusive; paths stay null
when an artifact was not written.
Reference stability: capture_scene_3d re-probes the page after each screenshot
and records stable plus, when false, stabilityReason. A checkpoint with
stable: false is rejected as inconclusive with that reason; packs without the
optional stable field remain accepted, while the other checkpoint fields are
still required. Capture cannot detect a WebGL context loss on the reference
page, so reference frames carry no context-loss proof — only the build side is
checked.
Build-side re-probe: before the screenshot the gate requires the build to hold
the reference's measured scroll position (±2 px) and to match the reference DPR
and canvas backing size. After the screenshot it re-probes again and requires
the position to stay within 2 px of both the pre-shot measured position and the
reference actualScrollTop, and the canvas rect, backing size and DPR to be
exactly unchanged; a WebGL context loss observed at either probe invalidates the
checkpoint. The screenshot is not atomic, so a post-shot shift is an
inconclusive result, not a pass.
Inconclusive cases include a missing, unreadable or blank frame (≤4 sampled
colours) on either side; an unstable reference frame; mismatched device pixel
ratio or canvas backing size (frames are never scaled); a scroll mismatch or a
post-shot shift; a missing or lost scroll root, a canvas that is missing, not a
<canvas>, outside the viewport, or not uniquely taggable (duplicate or
pre-marked decoys); WebGL context loss; the watchdog or a page
load, evaluation, screenshot or comparison timeout/error; and incomplete or
malformed evidence (missing pack, viewport or checkpoints, more than 10
checkpoints, or a checkpoint missing its required scroll/geometry fields).
The deadline is dynamic: the sum of the replayed checkpoint waits plus 10 s of
acquisition/comparison headroom, floored at 15 s and capped at 45 s (the
maximum schedule, 10 checkpoints x 2000 ms waits, yields 30 s). It is armed
before the pack is resolved and covers every asynchronous step: pack read, DNS
gate, artifact preparation, frame reads, the Playwright import/loader, browser
launch, and the comparison. A timeout returns inconclusive with the deadline
reason. Cleanup closes tracked resources
concurrently under one shared 3 s grace, so the result returns within the
deadline plus roughly 3 s; close promises still pending after the grace are
abandoned, and their underlying teardown may linger. Resources that resolve
after the deadline still get a closure attempt, but it is not awaited.
The build URL must be http(s) and its host must resolve to a public address.
Loopback, link-local, private, metadata and reserved destinations are refused;
the exact-origin loopback allowance is an internal test option, not a tool
input, so a build served from localhost is inconclusive for this gate.
Camera: without an adapter, scene-evidence-v1 records no camera state. The
three adapter records a single camera pose (and a camera list), not a
per-checkpoint angle; the spector adapter records none. cameraAngleDeg
therefore stays null with a stated reason and a camera tolerance cannot be
evaluated. That note alone does not make a measured pair incomparable.
Honest limits: one frame per checkpoint — animation that shifted in time relative to the reference may land outside tolerance for reasons unrelated to fidelity; the gate compares pixels only and does not read the pack's scene/camera/geometry evidence, so it cannot attribute a mismatch; and there is no scaling, so the build must match the reference's DPR and backing size exactly.
create_design_brief turns 2–5 shortlisted references into a cited direction:
Search and shortlist references with
search_sites.Call
create_design_briefwith the slugs and a required project goal.Use its Markdown direction and versioned JSON; set
includeStructure: trueonly when optional browser-derived section-band evidence is needed.
The response separates observed shared signals from one-site outliers, names evidence gaps, and never records motion automatically. Its Interaction Plan applies only evidence-backed cursor/hover, scroll, entrance/reveal, easing, and duration cues; empty fields mean the brief has no supporting evidence, not that an effect should be invented. It also carries a prefers-reduced-motion, content-access, and keyboard-access guardrail.
Data posture: element records store metadata + media URLs pointing at awwwards' own CDN — nothing is mirrored. Motion DNA records are local captures, each stamped with the time it was taken.
Related MCP server: Mimicus
Setup
Stable, current, fully offline — no API key, no account. Any MCP-compatible coding agent can use awwwards-mcp.
Requires Node ≥ 22.13 (node -v to check). Pick your agent:
Updates: the server checks the npm registry once a day and prints an
stderr notice when a newer awwwards-mcp exists (stdout stays clean for the
JSON-RPC channel — your agent sees the notice as a log line). Set
AWWWARDS_AUTO_UPDATE=1 in the server's env to opt into background
self-update; restart your agent afterwards to load it. Nothing is fetched
more than once a day and serving never waits on the check.
npxis the core, no-browser path.npx -y awwwards-mcpruns the package from an isolated cache that does not contain Playwright or ffmpeg-static, socapture_live_site,analyze_page_structure,record_site_motion,verify_buildand the other browser tools return an install hint instead of running. For those, use the global side-by-side install.
Claude Code
claude mcp add awwwards -- npx -y awwwards-mcpCodex CLI (ChatGPT desktop app and the IDE extension share this config)
codex mcp add awwwards -- npx -y awwwards-mcpor in ~/.codex/config.toml (project-scoped: .codex/config.toml):
[mcp_servers.awwwards]
command = "npx"
args = ["-y", "awwwards-mcp"]OpenCode (opencode.json — note the command is an array)
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"awwwards": {
"type": "local",
"command": ["npx", "-y", "awwwards-mcp"]
}
}
}ZCode (~/.zcode/cli/config.json — note servers nest under "mcp": { "servers": ... })
{
"mcp": {
"servers": {
"awwwards": { "command": "npx", "args": ["-y", "awwwards-mcp"], "env": {} }
}
}
}Claude Desktop / Cursor / Windsurf / Gemini CLI / Cline / Continue — anything
reading the common mcpServers JSON shape (e.g. ~/.claude/claude_desktop_config.json
or ~/.gemini/settings.json):
{
"mcpServers": {
"awwwards": { "command": "npx", "args": ["-y", "awwwards-mcp"] }
}
}Anything else — awwwards-mcp is a plain stdio MCP server: point your client
at npx -y awwwards-mcp for the core tools. To pin a version, use
npx -y awwwards-mcp@1.9.0.
pi coding agent has no built-in MCP by design — it uses skills and extensions instead. Two options:
Install the awwwards-inspiration skill (below). pi reads skills from
~/.pi/agent/skills/or~/.agents/skills/(the latter is shared across agents following the Agent Skills standard). The skill teaches the workflow; for it to reach the live data, add an MCP-supporting pi extension, or run the queries in another agent and paste results.Skip MCP entirely: ask pi to build you a small CLI wrapper around awwwards.com, or use a shared skills directory (
~/.agents/skills/) so the same skill file serves pi and every other agent.
Browser-enabled install (side-by-side)
Browser captures (capture_live_site, analyze_page_structure,
record_site_motion, the scroll/hover censuses, verify_build,
capture_component, export_design_tokens, analyze_images,
capture_pose_3d and capture_scene_3d) need optional packages that are not dependencies of
awwwards-mcp. The walkthrough below is the path the two checks at the end of
this section cover for the install layout:
Install the server and those packages side by side in one global prefix:
npm install -g awwwards-mcp playwright ffmpeg-static npm exec --global -- playwright install chromiumPoint your MCP client at the installed
awwwards-mcpcommand (notnpx). Remove an older entry in that scope first:claude mcp remove awwwards claude mcp add awwwards -- awwwards-mcp{ "mcpServers": { "awwwards": { "command": "awwwards-mcp" } } }Restart the MCP server (or the agent that hosts it). The client spawns the server process once; the new command and any
envonly take effect after a restart.Verification call — ask the agent to run one browser tool, e.g.
analyze_page_structureon any page:{ "name": "analyze_page_structure", "arguments": { "url": "https://example.com" } }Success is JSON with a
bandsarray (at least one entry) and atotalHeight. A response naming the Playwright install hint means the server cannot import or launch Playwright from its own install location; redo step 1 before using any browser tool.
In this layout all three packages are siblings in the same node_modules, so
the server's bare import("playwright") / import("ffmpeg-static") resolve
from its own install location; record_site_motion uses ffmpeg-static
automatically. npx -y awwwards-mcp has no such siblings: core tools work,
browser tools cannot. Installing only awwwards-mcp globally has the same
limitation — Playwright and ffmpeg-static must be installed globally too.
Two commands cover this walkthrough. npm run pack:smoke packs the tarball,
installs it into a throwaway global prefix and proves the side-by-side
resolution layout with stand-in Playwright/ffmpeg packages.
From a clone of this repository (the smoke is a dev check, not shipped in the
tarball), npm run smoke:browser packs and installs this checkout into a
throwaway global prefix with the real Playwright/ffmpeg packages linked as
siblings, then runs the installed server over MCP stdio against a local static
fixture with real Chromium:
npm run build && npm run smoke:browserThe smoke serves a three-section page on 127.0.0.1, seeds a throwaway cache
(so no crawl or daily update check starts), then makes two real calls — one
analyze_page_structure, one capture_live_site — and fails on a missing band,
a non-PNG image or a timeout. Observed result (Windows, Node 24, Playwright
1.63, 2026-11-01):
browser-smoke: pack + global install
browser-smoke: connected to awwwards-mcp, 41 tools
browser-smoke: analyze_page_structure -> 4 bands, totalHeight 2061, labels body,#hero.hero,#work.work,#contact.contact
browser-smoke: capture_live_site -> image/png 17.5 KB inline, saved capture-38f75233f8a4-desktop.png
browser-smoke: PASSResource limits and diagnostics
All optional and read at startup:
Variable | Default | Effect |
|
|
|
|
| Full serialized tool-result bytes (text, inline images and |
| unset |
|
|
| A positive N prunes cached |
|
| Maximum size of one cached CDN image/asset download; larger responses (declared or streamed) are aborted before they are fully buffered. |
The v1.14.0 AWARDS_MCP_* spellings (one fewer W) are still accepted as a one-release fallback; the AWWWARDS_MCP_* name wins when both are set.
AWWWARDS_MCP_PROFILE=v2 is the opt-in beta surface: 15 tools, never registered alongside the 1.x names. Ten consolidate the old surface (search_references, get_reference, browse_awards, get_index, inspect_page, analyze_motion, capture_page, audit_page, build_motion, monitor_awards) and five are retained (create_design_brief, build_project, verify_build, verify_flow, analyze_network_capture). Each consolidated tool takes exactly one request branch. monitor_awards add_watch/remove_watch require kind and pattern at the schema boundary (the 1.x handler rejected them later; the valid set is the same). Profiles are exclusive and read once at startup — full = 41, core = 13, v2 = 15 — so changing the value requires a server restart. The complete 1.x → v2 mapping for all 36 replaced names is in awwwards-skills repository.
capture_live_site also accepts inline: false to skip the base64 preview and maxInlineBytes to change the budget; captures whose base64 would exceed the budget (default 2.5 MB) are saved without an inline image, decided from the raw PNG size before conversion. Inline images from capture_pose_3d and capture_component count toward the same AWWWARDS_MCP_MAX_RESPONSE_BYTES budget. analyze_network_capture reads HAR files up to 20 MB (re-checked after reading) and 2000 entries. The analyze_bundle import graph supports import/reexport declarations up to 8 KB each.
Attach to your own browser
analyze_page_structure can scan a page you already have open instead of
launching its own browser. Start Chrome/Edge with a throwaway profile —
version 136+ ignores --remote-debugging-port on the default profile:
chrome --remote-debugging-port=9222 --user-data-dir=<throwaway dir>Open the exact URL in the window that starts: it runs in the throwaway profile,
not your everyday one, so it carries none of your normal cookies or logins.
Then set AWWWARDS_MCP_ATTACH=1 in the server's environment (restart the
server), and pass cdpEndpoint: "http://127.0.0.1:9222" — or
http://[::1]:9222, or a ws://127.0.0.1:9222/devtools/browser/<id> endpoint.
Loopback only. The endpoint must be
127.0.0.1or[::1]; HTTPS/WSS, credentials, queries, fragments, non-loopback hosts and extra paths are rejected. For anhttp://endpoint the server reads/json/versionitself (5 s timeout) and refuses to connect unless the returnedwebSocketDebuggerUrlis also a loopback ws URL.Never navigates, scrolls, clicks or creates tabs. The server selects the existing page whose normalized URL matches
urlexactly; if none matches it returns an error listing the open origins (never paths). It takes no screenshots and changes nothing on the page except an idempotentglobalThis.__namehelper used by dev-mode snippet runs.No compare.
compare: "mobile", a customviewportand responsive evidence are rejected in attach mode because each would drive the page.Disconnect only. When the scan ends the server disconnects from CDP; your browser and tabs stay open.
Off by default. Without
AWWWARDS_MCP_ATTACH=1the tool returns an error explaining the gate, so an agent cannot attach to a browser you did not offer. Keep the debugging port bound to loopback.
Skills
The seven agent skills live in the separate awwwards-skills repository, which is their source of truth. This package does not ship them.
Install them with the skills CLI:
npx skills add INSANE0777/awwwards-skillsTested pairing: awwwards-mcp@1.18.0 + skills-v2026.11.07. The 1.18
release keeps the same 41 / 13 / 15 tool surface, but rerun the
compatibility check before a later release changes either side.
The CLI detects your agents and lets you choose a project or user-level
install, then links each skill into that agent's skills directory. Useful
flags: --skill <name> for one skill, -a <agent> to target specific
agents, -g for a user-level install, --copy to copy files instead of
symlinking, and -l to list what the repository contains without
installing. Any agent that reads the
Agent Skills standard layout can also use the
skills/<name>/ directories from that repository directly.
Skill | What it teaches |
| First-time onboarding: asks the user's preferences (result density, viewport, captures, local index, winner watches), persists them to |
| The inspiration loop: search, judge from screenshots, pull design DNA, state a design direction, capture/motion-first builds; staying current with |
| The full video chain: what to record from a live site (and what to skip), frame-by-frame review (video input or tile-per-element), the motion inventory, and build verification by re-recording. Now opens with an instrument-first pass: scroll/hover censuses, motion DNA, and pose capture before (and instead of) recording. |
| Repair: run |
| Section-by-section rebuilding: band map → per-section capture → build → verify the aggregate band score → lock → next; selector fallback rules, shared-canvas one-unit rule, and the lock-before-next discipline. |
|
|
|
|
Agent | Skills directory |
Claude Code |
|
pi |
|
ZCode |
|
Agent Skills-standard agents |
|
Each installed skill is self-contained: it carries its own v2-routing.md
reference and, where needed, the _memory/techniques.json registry. Edit and
test skills in the awwwards-skills repository; this MCP repository does not
carry skill copies.
Indexing (recommended)
search_sites works out of the box, but its depth is limited by polite live
scraping (~31 sites per filter page). Build a local index once and searches
draw from thousands of award-winning sites instantly:
npx -y -p awwwards-mcp awwwards-index # once published
# or, from a local checkout of this repo:
npm run indexCrawls all ~200 tag pages at 1 request/second (~4 minutes) into the local SQLite cache at
~/.awwwards-mcp/.Resumable: interrupt it and re-run — completed pages are skipped.
The MCP server re-indexes automatically in the background whenever the index is older than 7 days (never blocking your session). Completed crawl checkpoints are cleared so each refresh actually revisits the tag pages. Run
get_index_statusto inspect progress or the last crawl error.
Elements corpus (gallery crawl retired)
The /elements/* gallery is robots-disallowed; it has not been fetched since
v1.16.0, when the gallery crawl was removed. npm run index -- --elements
(and the published awwwards-index --elements) exits 2 with an explanation
before any request, and search_elements returns an empty-corpus note instead
of indexing. There is no replacement crawler.
Cached gallery records from earlier versions remain searchable. New elements
come from winners first reported after the baseline poll: new_winners
backfills each one's site page Elements section as source:"site" records
when reachable. Site-derived slugs are namespaced site-<siteslug>-<title>,
so the two sources never collide. get_index_stats keeps elements.total as
the gallery-only count and adds elements.corpus with the full cached split
(total, gallery, site, categorized/uncategorized, builtWithKnown, oldest and
newest fetch timestamps), so the gallery count is not read as the searchable
set.
Element rows are searched by title, author, category and slug tokens
(slug is an FTS5-indexed column; a cache opened from an older schema version
rebuilds its search index automatically on first open). Each element also
carries the slug of the award-winning site it came from (siteSlug/siteUrl
in search_elements/get_element results).
Site details (palettes, tech stacks) are still fetched on demand and cached for 7 days. Awwwards page and CDN requests have a 10-second deadline per attempt, including response-body reading; transient page failures are retried once, while blocks (403/429) and CDN failures are not retried.
Limitations
Honest limits, so a result is not read as more than it measured.
The element corpus is partial after the gallery-crawl retirement. The
/elements/* gallery is not crawled. New records backfilled from winners' own
site pages are created with source: "site", category: "uncategorized" and
an empty builtWith list, because those pages carry no facet taxonomy. The
free-text query (title, author and slug tokens) is the reliable path. The
uncategorized category matches site-derived rows; other facet categories and
stack filters do not. An empty result does not prove the element does not exist.
verify_build scores structure and motion, not visual fidelity. The band
comparison returns one aggregate bands.score with matched/refOnly/
buildOnly labels; it does not score individual bands. Band
labels come from the structure scan as #id.firstClass (empty for anonymous
wrappers). A unique, non-generic label is matched exactly; anonymous or
duplicate labels fall back to same-tag plus closest height (within a 25% gap),
so two different sections of similar height can pair. The structure walk is
bounded: maxBands (default 40, smallest bands merged) caps the collapse step,
and landmark splitting can then add sub-bands up to its own limit of 60, so a
long or deeply nested page can still lose bands. domDiff reports
(incomplete) when its scans were truncated, and compact drops the evidence
lines. Capture timing can move the score: waitStrategy: "load" adds a 3 s
settle, a full-screen preloader can be waited on for up to 15 s, and content
that arrives after the capture (late fonts, images, hydration, animation) can
change the bands or motion fingerprint between two runs of the same URL.
Re-run before treating a delta as a regression; the score is evidence for a
diff, not a grade.
v2 is opt-in, not the default and not a 2.0 release.
AWWWARDS_MCP_PROFILE=v2 replaces the default 41-tool surface with the
15-tool consolidated surface described in
awwwards-skills repository. The default stays full; there
are no aliases between the surfaces, and switching requires a server restart.
Third-party MCP directories are refreshed by their operators. A listing such as Glama re-inspects this server on its own schedule; re-inspection there is a manual post-release admin step, not an API call or a code change in this repository.
How it works
Live, polite scraping of awwwards.com public pages (max 1 request/second, robots.txt-compliant paths only, cached 7 days in SQLite at
~/.awwwards-mcp/).Screenshots are served from Awwwards' own CDN (880×660), cached on disk.
No API key, no account, no cost.
Official Awwwards resources
Awwwards publishes agent-facing, read-only resources:
llms.txt — guidance for agents.
openapi.json — OpenAPI 3.1 spec.
Annual Awards API —
https://www.awwwards.com/api/annual/categories,https://www.awwwards.com/api/annual/nominees/sites/{id},https://www.awwwards.com/api/annual/nominees/users/{id}.
The three get_annual_* tools use this official public API (JSON:API) at
1 request/second with a 7-day local cache. Daily listings (SOTD, developer,
honorable mentions, tags, colors) still use polite scraping of public
pages. Media URLs returned by the annual tools are reference-only: full nominee
payloads carry mediaNote: "reference-only", and nothing is downloaded,
mirrored, or redistributed.
awwwards-mcp is an independent open-source project, not affiliated with or endorsed by Awwwards. Annual data is intended for personal, non-commercial design-inspiration use; Awwwards' terms and the featured creators' rights still apply.
Ethics & terms
This tool fetches publicly available pages for personal design-inspiration use, at human-ish request rates, honoring robots.txt. Awwwards' screenshots and content remain the property of Awwwards and the credited creators — don't bulk-scrape, redistribute, or republish them. If you use this commercially, review awwwards.com's terms yourself.
Built with awwwards-mcp: seven real sites
Four complete sites were built through the full inspiration loop this MCP
enables, using nothing but the server's tools plus the shipped
awwwards-inspiration skill. Each one exercised a different corner of the
loop — and every correction the loop caught on the way became doctrine in the
skill.
Built in one shot, by a model that can't watch video. All three sites were built in a single prompt run on GLM 5.3-flash — which does not support video input. The loop's motion study worked entirely from frame-tiled filmstrips (ffmpeg, 1–2 fps per element) instead of watching the recordings. With a video-native model, those same
get_site_elementsvideos andrecord_site_motion.webm files could be watched directly — timing, easing and overlap read at full fidelity — and the motion-true results would be better still. The skill's frame-tile doctrine is what closes that gap today.
Watch the whole loop run (1:50):
Screen recording of the agent running the awwwards-inspiration loop end to
end with the awwwards MCP tools — searching SOTD references with inline
screenshots, pulling design DNA, frame-studying element videos, building, and
verifying with band maps + motion recording. If your client doesn't render
the player, watch the file directly.
1. Ridge
(source) — a Swiss-minimal single-page showcase for a fictional engineering-talent studio, direction Aspen Search (SOTD + Developer Award, jury 7.48): monochrome #FAFAF8/#1A1A1A + mint, giant grotesque section markers, halftone grain, asymmetric panel grid, dark discipline panels in an interior horizontal pin passage, count-up stats, client rows, theme toggle, cursor-follower. Built with the v1.4.0 toolkit: FTS5-ranked direction search, both-viewports reference captures and QA (desktop 7,849px + mobile 390×844), overflow audit (0px both), pin-center shots, film verification — and the findings fed back into the skills. QA evidence: showcase/ridge/_qa/.
The grain-panel hover, studied from aspensearch.com's recording and rebuilt as a canvas dither-dissolve — dots flip to mint around the mouse, the trail elongates, the boundary dissolves:

Panel grid (desktop) | Horizontal discipline passage | Mobile 390×844 |
|
|
|
2. Fallow Press
(source) — a flat-2D editorial journal, direction
Emergence Magazine (SOTD): pink #FF9398 on cream and black, torn-paper
masthead (pure CSS clip-path, zero WebGL), giant grotesque display over
grayscale photography, serif-italic brand, three pages with separate
horizontal projects/about pages (GSAP ScrollTrigger pin +
containerAnimation).
Torn-paper masthead (home) | Horizontal gallery (Fields) | Horizontal chapters (Practices) |
|
|
|
The loop as it ran:
search_sites(magazine filters) → shortlist judged from inline screenshots →get_site_detailson Emergence Magazine.Capture before building:
capture_live_site+record_site_motionon the live site first; full-page PNG and motion .webm kept in showcase/fallow-press/ref-motion/ as the evidence trail.Build, then verify: full-page capture plus panel-center pin shots of both horizontal pages (13 stops each, in showcase/fallow-press/_qa/ —
capture-qa.mjsis reusable).The pin shots caught a real bug: horizontal-panel entrances used
toggleActions: "play none none reverse", and 100vw panels hide content at midpoints on the way back — copy disappeared mid-view. Fix (one-shot play entrances) is now doctrine: full-viewport panels get one-shot entrances; QA pin shots land at panel centers, not uniform fractions, or you photograph empty transition zones.
3. Cerebrium recreation (C:/Users/Afjal/cerebrium-recreation/) — a
fidelity-first recreation of cerebrium.ai, pixel-checked against the live
reference: full-page captures of both sides, analyze_page_structure band
compare, and SVG icon/legend fixes until the build matched the reference to
within 1px of total page height (10,871px vs 10,870px). This is the
structure-before-pixels doctrine at its strictest — band maps compared,
never just totals.

4. The Meridian (C:/Users/Afjal/editorial-site/) — an editorial journal
built from ORDR/Hearst references: the first build to run the whole loop
end-to-end. analyze_page_structure caught a masthead band bug by comparing
the build's band map against the reference's; the reference captures,
motion film, and the reusable pre-scroll capture script live in
editorial-site/_qa/.


5. NEUTOMNI one-shot rehost (A:/nio/) — a 1:1 capture-and-rehost of
neutomni.com built in a single MCP pass: the live page was captured with the
toolset and re-served locally with the site's own DOM, stylesheet, and scripts
(relaunched as a standalone static copy — no CMS, no build step). This is the
migration-recovery posture: for sites you own or are authorized to
rehost when the original vendor vanishes. Faithful because nothing was
re-derived — geometry, motion, and copy come along exactly.
The full build lives in the repo: showcase/neutomni/ —
open index.html directly, no server or build step needed.










6. NEUTOMNI study recreation (showcase/nio/) — a hand-built recreation of neutomni.com reconstructed from MCP evidence (band map, component packs, scroll/hover censuses, motion DNA, pose capture) rather than rehosted markup: authored HTML/CSS/JS with GSAP + ScrollTrigger + Lenis, sourced fonts/images/audio vendored locally. Ships with the mandatory study-build disclaimer and a full provenance list in its own README — a private reference build, not for publication; replace the borrowed assets before any real use. This is the recreate skill's end-to-end artifact.
7. Two26 Studio study recreation (showcase/two26/) — a hand-authored recreation of two26.studio built with the 1.14 MCP. The site is an inner-scroller page (body{position:fixed} + .page{overflow-y:auto}): analyze_page_structure now reports scrollRoot: div.page and the full 13,103px band map; capture_live_site waits out the preloader, then returns mode:"anchors" — six ordered viewport shots down that inner scroller (JSON paths, no inline image). Built from eight component packs, scroll/hover censuses + motion DNA, with 13 GSAP triggers (2 scrubs, 1 pin), local fonts/media, QA at five viewports, and a 54-file provenance list in its README. Mandatory study-build disclaimer: not for publication; replace borrowed assets before any real use.

Skills used to build these
Skill | Role in the builds |
| The 8-step loop itself (from the awwwards-skills repository): search → judge from screenshots → design DNA → capture/motion study → state direction → build → band-map verify. |
| Builds a cited DESIGN.md plus evidence sidecar for one public URL from tokens, structure, screenshot and up to three components. |
| The horizontal pin + |
| Tween composition and sequenced hero entrances (torn-paper drop, panel copy rises). |
| Typography, palette and layout judgment applied when translating reference DNA into original pages. |
| smooth scrolling synced to ScrollTrigger on the Fallow Press home page. |
| All builds are plain hand-rolled CSS — flat 2D, no frameworks needed. |
The skills live in the awwwards-skills repository: that repository is their source of truth, including the _memory/techniques.json registry of researched how-tos per domain (video understanding, motion detection, UI structure, micro-interactions, images). Skill changes land there; this MCP repository does not carry skill copies.
Reduced-motion, JS-less visits, and capture tools all get graceful fallbacks (vertical stacks; progressive-enhancement reveals).
What the verification loop caught — proof the structure-before-pixels doctrine is load-bearing:
Element posters lie: the first showcase build was designed from poster frames alone and rendered a spinning 3D ring as floating static cards. Downloading the element videos (
get_site_elements) and frame-tiling them revealed the motion truth — now the skill mandates studying motion before animating.Full-page captures of reveal-on-scroll builds showed blank sections:
.revealanimation state vs capture's no-scroll reality. Builds ship content-visible-without-JS progressive enhancement.Horizontal-panel copy vanished mid-view on the Fallow Press pages:
toggleActionsreverse reverts entrances while a 100vw panel is still holding the viewport (see above).Band-map compare kept the references' rhythm instead of drifting on section heights (Cerebrium, The Meridian).
Prompt counts: 3 for the original showcase build (the build ask, the
motion correction that exposed the poster-lie, the structure pass) and
1 for Fallow Press ("create a new website using our MCP and skills… no
3D websites") — its two follow-ups were caught by the QA loop, not by the
user. Each correction became doctrine in the shipped awwwards-inspiration
skill: frame-study element videos before animating; judge page architecture
from the studied passages; tile per element, not one giant filmstrip;
capture live sites and animation before building.
Can awwwards-mcp crawl the sitemap? (robots.txt notes)
The awwwards.com robots.txt advertises
Sitemap: https://www.awwwards.com/sitemap.xml and — verified live
2026-09-18 — that sitemap URL returns a soft-404 HTML page (as do common
child names like /sitemap-websites.xml). So sitemap discovery isn't
currently a path to more data; the polite crawl surface is exactly what the
indexer uses:
Allowed and used:
/websites/,/websites/<filter>/,/sites/<slug>(one filter per URL; deep pagination stays un-crawled).Disallowed:
/tag/,/search-websites,/websites/?(query-string pagination),/elements/*(not fetched since v1.16.0; the gallery crawl was removed; the client rejects these paths),/vote/, favourites/likes/follows, and the rest of the 33 rules.Our client (
src/awwwards.tsbuildFilterUrl) constructs only/websites/…paths at 1 request/second — the loop stays inside the published rules by construction, not by convention.
Contributing
PRs welcome! The project especially needs parser-drift fixes — when live awwwards.com markup changes, a fresh HTML snapshot attached to an issue often becomes the new test fixture and the fastest merged PR. See CONTRIBUTING.md for the full guide:
Parser-drift is monitored automatically. A probe script
(scripts/parser-drift-probe.mjs,
npm run drift) checks every markup anchor the parsers depend on — the
split/indexOf/regex literals in src/parsers.ts — against the live
listing and detail pages (2 fetches, 1 request/second, same politeness as
the client). A daily GitHub Action (.github/workflows/parser-drift.yml)
runs it and, on drift, opens/updates a single tracking issue with the exact
anchors that changed (and auto-closes it when a later run is green). To run
it yourself: npm run drift (live, exit code 0/1/2) or npm run drift -- --fixture
(offline, checks the committed fixtures still feed every anchor). Raw HTML
is never diffed or stored — anchors only fire when the parsers actually
break, so there are no false alarms from cosmetic tweaks.
Development setup & project layout (offline fixture-tested, no network in tests)
How to create a PR: fork →
fix//feat//docs/branch → typecheck + tests → PR templateThe politeness constraints new code must keep (1 req/s, robots.txt paths, light runtime deps)
Bugs and feature ideas start as issues with templates. Security problems go privately — see SECURITY.md. By participating you agree to the Code of Conduct.
Development
npm install
npm test # offline unit tests against committed HTML fixtures
npm run smoke # manual live smoke test against awwwards.com
npm run build # compile to dist/MIT — see LICENSE.
Available Tools
41 toolsanalyze_accessibilityARead-only
Collect accessibility EVIDENCE from a live page — an evidence census, not a compliance audit. Samples up to limit (default 100, max 200) visible text nodes with computed colour and a background composited bottom-up from the ancestor stack (colour alpha layers), then the contrast ratio (worst pairs with selector paths). Samples under any ancestor opacity group (<1) are excluded from ratios and counted in coverage.skippedOpacityGroups, never approximated; background images, gradients and pseudo-elements are not composited either, so contrast stays heuristic there. Also: image alt coverage; heading ladder (skipped levels, multiple h1); focusable/positive-tabindex counts plus outline:none stylesheet rules; unlabeled form controls; document lang/title. Result carries coverage and heuristic:true. http(s) URLs only; requires the optional playwright dependency and degrades to {error}. Personal, non-commercial use.
Inputs: url (required), limit, viewport.
analyze_bundleARead-only
Bundle forensics for a live page: fetch it once, download its script chunks (script tags, inline scripts, and modulepreload/preload-as-script hints; bounded: ≤40 chunks, 10MB, 1 request/second), save them locally, optionally de-obfuscate with webcrack if installed, and grep keywords across the code. Returns chunk paths + match lines so an agent can read the actual animation mechanism instead of guessing. Opt-in bundleIntel adds route, vendor, source-map presence and module-graph evidence; source maps are detected but never fetched, and default output keys are unchanged. Runs on URLs you are authorized to analyze — does not fetch awwwards.com.
Inputs: url (required), edges, keywords, maxChunks, +2 more.
analyze_hover_censusARead-only
:hover interaction census of a live page: counts hover rules, samples up to 20 interactive elements, and reports which CSS properties change on hover with transition duration and easing. Use it to reproduce micro-interactions and verify interaction-state coverage. On mobile the hover loop is skipped and a note is returned. compact=true returns a token-diet summary. Runs on any URL — does not fetch awwwards.com.
Inputs: url (required), compact, viewport, waitStrategy, +1 more.
analyze_imagesARead-only
Image-delivery audit of a live page: totals by format, loading strategy, responsiveness and dimensions; flags broken, oversized, tiny and missing-alt images with issue samples. The page loads its own assets (no tool-initiated fetches) after load, a 3s settle, fonts and a pre-scroll that triggers lazy loading. Runs on any URL — does not fetch awwwards.com.
Inputs: url (required), viewport, maxImages.
analyze_network_captureARead-onlyIdempotent
Offline API-surface evidence from a local HAR 1.2 file (browser devtools export): groups requests by method + origin + path template (ISO dates, versions, UUIDs, hex ids and numbers templated; emails, tokens and long high-entropy segments redacted), with counts, statuses, content types and query names only. Reads the file only — never fetches recorded URLs, never returns bodies, headers or query values. No network.
Inputs: path (required), top.
analyze_page_structureARead-onlyIdempotent
Extract a page's section band map (tag, label, background color, offset, height per band) via a headless browser. Works on live URLs and file:// paths — use it to compare a reference site's structure against your local build. compare:"mobile" also captures at 390×844 and returns mobileBands + diff {heightDelta, bandsAdded, bandsRemoved, reordered} plus responsive evidence: horizontal overflow, small text and small tap targets. cdpEndpoint instead attaches to a browser you started (AWWWARDS_MCP_ATTACH=1) and scans the already-open matching page: it never navigates, scrolls, clicks or creates tabs.
Inputs: url (required), compare, maxBands, viewport, +3 more.
analyze_scroll_mapARead-only
Per-element motion census of a live page: what animates, its CSS properties, duration, delay, easing, and what triggered it (GSAP ScrollTrigger, native CSS scroll()/view() timelines, data attributes, SMIL/SVG). Includes svgStrokes list for stroke draw-in effects. Runs on any URL you give it (builds, references) — does not fetch awwwards.com. Run twice (with reducedMotion) to audit prefers-reduced-motion degradation. Optional scrubProbe drives the page and returns real progress curves per scrubbed trigger. compact=true returns a token-diet summary. Every payload also carries a choreography block: stagger hints (hint selector/value/source, groups) distilled from GSAP tween vars and stepped delays across sibling animations.
Inputs: url (required), compact, viewport, scrubProbe, +2 more.
analyze_stackARead-onlyIdempotent
Fingerprint a page's framework (Next.js/Astro/Nuxt/Remix/SvelteKit/WordPress/Webflow/Framer), CSS framework (Tailwind/Bootstrap), and marker libs from fetched HTML — runs on any URL, one polite request, no browser
Inputs: url (required), timeoutMs.
audit_urlARead-only
Audit any live page as evidence, not a grade: runtime frame/long-task/layout-thrash measurement via an installed Chrome/Edge over raw CDP (no playwright), plus static animation anti-patterns scanned over the page HTML and up to 8 same-origin CSS/JS assets (bounded: 8 assets, 2MB each, 1 request/second shared limiter, default 10s timeouts). Asset refs resolve against the final post-redirect page URL; asset redirects leaving that origin are rejected. Findings are severity-sorted before the 50-item cap, so worst is always present. nextActions ranks the first three fixes. compact=true returns the url, a reduced perf block (fps, droppedFrames, longTasks, layoutThrashing), pre-cap antiPatterns counts (count, worst, high, medium, info), coverage, nextActions and note; omit it for the full findings and full perf. Degrades honestly - perf carries {error} when no browser is available and the static scan reports its own error; neither suppresses the other. Personal, non-commercial use; audit only URLs you are authorised to inspect.
Inputs: url (required), compact, viewport, timeoutMs.
build_gsap_stubARead-onlyIdempotent
Generate a runnable GSAP+ScrollTrigger timeline stub from captured motion evidence (scroll census anims + optional synthesized camera anchors from a pose grid) — pure build from provided JSON, no page fetches
Inputs: scrollCensus (required), poseGrid.
build_motion_manifestARead-onlyIdempotent
Build a motion.manifest.json scaffold from measured evidence: an analyze_page_structure result (bands) + an analyze_scroll_map census, with optional section overrides. Sections are mapped best-effort from each band's tag + first #id/.class token in its label (or sections[].selector) — no markup is available, so DOM initial-state hints are empty; census triggers still attribute to sections by those tokens. Returns { manifest, measured:false, censusAnims, warnings, note }; manifest.measured stays false when the census has no anims/triggers/curves. Never throws ({ error } on invalid input). Pure/offline — no page fetches.
Inputs: bands (required), scrollCensus (required), sections.
build_pose_stubARead-onlyIdempotent
Render a captured pose grid (pose-grid-v1 from capture_pose_3d) as a standalone scroll-scrubbed three.js stub page: frames preloaded inline, a synthesized camera path interpolated between snapshot scroll ratios (guidance only — the pose grid stores frames and scroll ratios, not recovered camera transforms), prefers-reduced-motion static fallback, optional census-derived st/pin/ease suggestions. Pure build — no page fetches, no awwwards.com access.
Inputs: poseGrid (required), scrollCensus.
build_projectA
Convert a single-file exact rebuild (any local .html, e.g. the rebuild flow's full-page-exact.html) into a runnable Vite, Astro or Next.js project: sections become components, CSS splits per section, gsap timelines re-wire in the framework idiom (useEffect + gsap.context on Next), assets carried. Reads a local file and writes the project dir. The output is source, not a servable site: install and build it (npm install && npm run build) and serve the generated output (Vite/Astro dist, Next .next with next start), not the raw scaffold directory. Pairs with verify_build: build → convert → verify.
Inputs: out (required), target (required), htmlPath (required), name.
build_scene_stubARead-onlyIdempotent
Generate an offline Vite + Three.js scaffold from a capture_scene_3d evidence pack (scene-evidence-v1), not a recovery: the pack stores rendered frames and observed responses, so unless the experimental three adapter recorded a bounded scene summary, no scene graph, camera, controls, shader source or geometry is read, and captured application code, shader source, userData and callbacks are never executed. With evidence.three it recreates only Box/Plane/Sphere/Cylinder primitive meshes with position/quaternion/scale, MeshStandard/MeshBasic colour/opacity and locally bound texture maps, plus a static perspective camera applied from its exact captured matrix (matrix auto-update off); captured controls are never recreated, and unsupported geometry, materials, cameras and controls are listed as unresolved instead of guessed. Validates evidencePath itself (regular file, <=2 MiB, inside /scene-captures or a pack exported with top-level "exported": true) and up to 32 assetBindings (resourceId must be an observed inventory row that is not a script or shader; localPath must exist, be a regular non-symlink file <=64 MiB with a glb/gltf/bin/png/jpg/jpeg/webp/ktx2/hdr/exr extension; traversal and duplicate resourceIds are rejected). Returns files[{path,content}] (package.json with pinned three 0.160.0 + vite and dev/build/preview scripts, index.html, src/main.js with resize, reduced-motion static render, GLTFLoader for a bound model, texture loading, a clearly labelled placeholder plane when no model or captured mesh exists, disposal on pagehide and a load-failure message, scene.json describing bindings and frame references, and a provenance README), assetCopies[{from,to}] to public/assets/., unresolved[], authoredDefaults[] and provenance; mode is "reconstructed-subset" when a glb/gltf model is bound or the three adapter recorded at least one supported mesh, otherwise "placeholder". Deterministic and byte-stable, and strictly offline: no fetch, no install, no directory writes - copy assetCopies, then run npm install && npm run build yourself.
Inputs: evidencePath (required), title, assetBindings.
capture_componentARead-only
Serialize a page component (structure, computed-style tokens, animations) into a portable pack for rebuild tooling. Adds typography usage summaries (families/sizes/weights/line-heights/letter-spacings, top 12 each + sampled node count) and paletteSummary (colour counts from node styles + pack colors, transparent/rgba(0,0,0,0)/none filtered, top 24). compact=true returns a token-diet summary and omits both. Runs on any URL — does not fetch awwwards.com.
Inputs: url (required), compact, maxDepth, maxNodes, +3 more.
capture_live_siteARead-onlyIdempotent
Take a fresh full-page screenshot of a live website URL using a headless browser. Requires the optional playwright dependency. Caveat: inner-scroll pages (body pinned, one container scrolls) return mode:"anchors" — six ordered viewport screenshots as JSON paths, not one full-page image.
Inputs: url (required), inline, viewport, publicOnly, +4 more.
capture_pose_3dARead-only
Capture a page's WebGL/canvas pose grid: samples the largest canvas (toDataURL, viewport-screenshot fallback) at up to 10 scroll steps with per-step scroll ratios, for studying scroll-driven canvas motion as frames. Frame evidence only — camera transforms are not recovered. Runs on any URL — does not fetch awwwards.com. Requires the optional playwright dependency.
Inputs: url (required), steps, viewport.
capture_scene_3dA
Scene evidence in two strict operations. request.op:"capture" records a passive evidence pack for a WebGL/canvas page: at each checkpoint it scrolls the selected root, optionally moves the pointer, and saves a viewport screenshot plus a clipped canvas screenshot, with requested/actual scroll, canvas CSS rect/backing size/DPR and elapsed time. It also records a redacted inventory of the page's own responses (URL, MIME, size when declared, resource type, texture/model/HDR/shader/script/font/image guess, and an assetId per row) and passive framework hints (THREE.REVISION, BABYLON.Engine.Version, pc.version, matching script URLs, canvas count) without calling getContext or installing hooks. request.op:"download_assets" downloads up to 32 inventory assets from one capture: downloading is a licensing decision, so rights.basis (owned|licensed|permission) and rights.evidence are mandatory, are recorded with a timestamp in scene-captures//provenance.json, and are not verified by the server - do not download assets you may not use. It only fetches observed inventory URLs that carry no query string, fragment or credentials; there is no crawling, no guessed model or source-map URL and no credential use. Original bytes are written under scene-captures//assets with SHA-256 and an extension validated from MIME/magic (glb, gltf, bin, png, jpg, webp, ktx2, hdr, exr); unknown types are skipped unless allowUnknown saves them as .bin. Caps: 16 MiB per file, 64 MiB per run, 5 manual redirects, 1 request/second, one request at a time, 15s body deadline, 120s overall; every hop is DNS-validated and loopback/private/metadata/reserved addresses are refused. Honest scope: without the opt-in adapters no scene graph, camera, controls, shader source or geometry is recovered - frames show rendered output only. adapters are experimental and opt-in (at most two entries, each once): "three" reads objects reachable from window.THREE, window.scene/camera/renderer and window.app/experience/viewer/world after load (no heap crawl, no hooks, no network) and adds a bounded evidence.three summary (max 500 nodes, depth 20, 8 cameras, 8 lights, 32 materials, 200 texture URLs); "spector" needs the optional spectorjs package, installs its bundle as an init script before load and captures one WebGL frame into a bounded evidence.spector summary (command names/counts, context attributes, analyses, max 8 programs, 16 shaders, 64 KiB per shader source and 256 KiB of shader source total; command arguments, state, results, stack traces and memory are never transferred, and shader source is untrusted page text that is never executed). scene/camera/controls/geometry are marked available only for what three actually returned, shaders only when spector captured at least one source, and neither adapter promises scene recovery. Evidence is written to scene-captures//evidence.json plus PNG frames; responses are compact JSON with assetIds and downloadability, paths, hashes, counts, coverage and limitations, never inline image or asset bodies. The capture op requires the optional playwright dependency; download_assets does not.
Inputs: request (required).
compare_sitesARead-onlyIdempotent
Compare the design DNA of 2–3 Awwwards sites: titles, live URLs, palettes, technologies, elements, awards and jury scores. Text only; missing details are fetched and cached. For your own build vs a reference, use verify_build instead.
Inputs: slugs (required).
create_design_briefARead-onlyIdempotent
Synthesize a cited design direction from 2–5 Awwwards site slugs plus a project goal. Uses cached detail (including its element list) and Motion DNA evidence first and fetches only missing details; includeStructure=true also runs a browser band analysis per reference. Returns one Markdown text block containing versioned JSON: shared signals vs one-site outliers, evidence gaps, an evidence-backed interaction plan, and reduced-motion/content/keyboard guardrails. The structuredContent field mirrors that JSON. Use search_sites to find slugs; use compare_sites for raw side-by-side DNA and analyze_page_structure for a band map — this tool synthesizes a brief; it does not score a build or run a motion census.
Inputs: goal (required), slugs (required), audience, maxBands, +4 more. Returns: goal, sources, version, audience, +2 more
export_design_tokensARead-only
Extract a page's design tokens (colors, typography, spacing, radii, shadows, borders) from computed styles and return ordinal CSS custom properties plus a Tailwind theme map. Token names are ordinals (--color-1, --space-1, ...), never semantic guesses. Runs on any URL — does not fetch awwwards.com.
Inputs: url (required), include, maxNodes, selector, +2 more.
get_annual_categoriesARead-onlyIdempotent
List the official Awwwards Annual Awards categories (Site of the Year, Agency of the Year, …) with nominee counts. Annual Awards only: this is not the daily site index. Annual data comes from Awwwards' official public read-only API for personal, non-commercial inspiration use; nominee details are hydrated on request. Media URLs are reference-only — nothing is downloaded.
Inputs: no named parameters.
get_annual_nomineeARead-onlyIdempotent
Annual Awards only: get one official Awwwards Annual Awards nominee in full: site entries carry date, description, designBy, country, image/video URLs; agency entries carry location, avatar, award tag counts and featured projects. Pass id (a UUID or full /api/annual/nominees/... path) or category+slug; category+slug may hydrate up to 20 uncached nominees at 1 request/second (~20s worst case), so prefer id when known. Personal, non-commercial inspiration use only; media URLs are reference-only and nothing is downloaded.
Inputs: id, slug, category.
get_annual_nomineesARead-onlyIdempotent
Annual Awards only: list nominees in one official Awwwards Annual Awards category, hydrated on demand at 1 request/second (default 10, max 20 per call). Site summaries carry siteSlug and inLocalIndex, so an agent can jump to get_site_details when the daily index has the site. Personal, non-commercial inspiration use only; media URLs are reference-only and are never downloaded.
Inputs: category (required), limit, offset, hydrate.
get_collectionsARead-onlyIdempotent
Browse Awwwards' curated thematic moodboards, not a search index. Without a slug, lists collections (paginated); with a slug, returns that collection's first page of site cards. Curated slugs look like 'brutalism'; member collections need 'owner/slug'. One page per call, 7-day local cache. Personal, non-commercial inspiration use.
Inputs: page, slug.
get_elementARead-onlyIdempotent
Get one Awwwards element in full: title, author, built-with stack, media URLs, related elements and the parent award-winning project. Use search_elements first for ids.
Inputs: id (required).
get_index_statsARead-onlyIdempotent
Aggregate metrics over the LOCAL cache only (zero network). ALL-TIME: site count, gallery element count and technology/tag frequency; elements.corpus discloses the whole locally cached element set (total, gallery, site, categorized/uncategorized, builtWithKnown, fetched date range) while elements.total stays gallery-only. WINDOWED by windowDays (default 90, 1-3650): cached details, palette colour frequency and jury score stats from at most the 500 most recently fetched detail rows, plus Motion DNA library frequency. Each metric carries coverage labelled 'locally cached subset'; windowDays/detailsCached/detailParseCap appear only on windowed metrics (sites/elements/technologies are explicitly all-time). top caps each frequency list (default 10, 1-50). Aggregates only - no site slugs or titles. Personal, non-commercial use.
Inputs: top, windowDays. Returns: top, note, sites, colors, +6 more
get_index_statusARead-onlyIdempotent
Read offline index status: cached site count, progress, last successful finish and error, lock state and freshness. No live requests.
Inputs: no named parameters. Returns: lock, progress, lastError, sitesCount, +2 more
get_motion_dnaARead-onlyIdempotent
Get the Motion DNA of a website: animation stack, ScrollTrigger/pin/scrub counts, easing vocabulary and duration distribution. Live captures append a censusSummary block (per-source scroll-census counts) from the same single launch. Serves the corpus first; live-captures unseen URLs (headless browser required).
Inputs: url (required), recapture.
get_site_detailsARead-onlyIdempotent
Get the design DNA of one Awwwards site: color palette, technologies, design elements, awards, description and inline screenshot. compact=true returns a token-diet summary. Batch: pass slugs (1–10, no images) for ordered compact details per slug with cached/fetched/error status; compact is ignored in batch mode (batch output is always compact). Provide exactly one of slug or slugs.
Inputs: slug, slugs, compact.
get_site_elementsARead-onlyIdempotent
Get the design-element highlights of one Awwwards site: component-level visuals (3D models, video content, mobile layouts, microcopy) with poster images inline and video URLs.
Inputs: slug (required).
list_categoriesARead-onlyIdempotent
List the filter taxonomy available on Awwwards: award collections, color hexes, tag/technology slugs usable with search_sites, and the annual winner categories.
Inputs: no named parameters.
new_winnersARead-only
Poll today's new Awwwards winners as a delta against the previous poll: new-entrant cards since the last call (first call seeds the baseline and reports no delta). Poll daily for a winners feed; pairs with watch_site for structured monitoring.
Inputs: award.
record_site_motionADestructive
Record a short motion-through video of a live website - preloader, scroll-triggered and hover/cursor animations - and return an inline filmstrip JPEG plus the .webm path. Requires the optional playwright and ffmpeg-static dependencies. Also writes a Motion Evidence Sheet (keyframes with census-stamped captions, diff masks, cursor-trail overlay, timeline strip) beside the filmstrip. This is not read-only: to expose hover/click motion it can click interactive elements and submit their forms.
Inputs: url (required), frames, viewport, waitStrategy.
search_directoryARead-onlyIdempotent
Search the Awwwards directory of agencies/studios, not sites. Filters are path-based, so one of country/category/budget applies per request; query is matched client-side over the fetched page. Returns public profile cards (name, slug, location, website, award counts) — contact details are stripped. One page per call, 7-day local cache. Personal, non-commercial inspiration use.
Inputs: page, query, budget, country, +1 more.
search_elementsARead-onlyIdempotent
Search Awwwards UI components — award-grade footers, menus, loaders, transitions, micro-interactions… — across cached gallery records plus source:"site" records derived from new SOTD winners' own Elements sections. It does not crawl the /elements/* gallery (robots.txt disallows it). Usage: pass query text; category and stack combine as AND when both are provided and are applied across the whole cached corpus before the result limit; each result carries its element slug, source and parent project identifiers.
Inputs: limit, query, stack, category.
search_motionARead-onlyIdempotent
Search captured Motion DNA records: find sites that pin sections, scrub scroll-driven animation, or run a given animation library. Corpus only — live-capture happens via get_motion_dna.
Inputs: lib, limit, hasPins, scrubOnly.
search_sitesARead-only
Search award-winning websites on Awwwards — the site index with filters. Returns site cards with inline screenshots, live URLs, awards and tags. Filters combine as AND. count defaults to 6 (max 12); page is one-based over the matched local set, and deep upstream query-string pagination is not crawled. Color searches always fetch the live filter page (site rows carry no colors). Use search_directory for agencies/studios, search_elements for UI components, get_collections for moodboards, new_winners for today's delta, and get_site_details for one site's DNA. A failed top-up keeps the already-cached page window; if the required live fetch fails, stale cached rows are served (page 1; color unchecked).
Inputs: page, tags, award, color, +5 more.
verify_buildARead-only
Compare a built site against a reference (an Awwwards winner, a client's old site, any URL): band-structure match + motion fingerprint similarity, with a pass/warn/fail verdict and evidence lines. Band labels are #id.firstClass, so give your rebuild's sections stable ids/classes; anonymous rebuild labels (empty/body, or duplicates) fall back to tag+height matching. compact=true returns the verdict, overall and band score, band counts (matched, refOnly, buildOnly), motion score and captureStable (false when either capture moved or the two captured different heights/animation counts); omit it for evidence lines. Live reports also carry a capture: evidence line with each side's rendered height, animation count and stability, because fixed waits can sample async content at different moments; a score that moved with capture state is visible there. Closes the design loop: build → verify → fix → re-verify. Reference can be an award site found via search_sites, compared read-only via compare_sites. scene3d is a SEPARATE opt-in 3D gate: it replays a capture_scene_3d pack on the build canvas, compares cropped PNGs pixel-by-pixel and returns its own status/verdict under scene3d (with diff PNGs), keeping overall/verdict legacy semantics; the legacy pass never certifies a canvas, and without pixelThreshold + maxChangedFraction it reports metrics only (inconclusive).
Inputs: buildUrl (required), referenceUrl (required), compact, domDiff, +3 more. Returns: bands, motion, domDiff, overall, +5 more
verify_flowA
Step-aligned comparison of interaction flows: runs the same 1–6 scroll/click/wait steps on a build and a reference page (two fresh headless launches, desktop or mobile), then compares path, scroll delta, skeleton hash, text hash and element count after each step. A step is same only when both sides are complete and untruncated; truncated or failed states are unknown. No screenshots: hashes are evidence, not visual truth. A click can still trigger client-side mutations. Runs on URLs you are authorized to inspect. Use verify_build for a scored structure/motion comparison; build_project converts a local file into a project and never verifies. Needs the optional Playwright dependency.
Inputs: steps (required), buildUrl (required), referenceUrl (required), viewport, +1 more.
watch_siteA
Longitudinal watchlist over Awwwards listings: track a studio (e.g. 'ToyFight'), a tag/technology slug (e.g. 'webgl'), or a site URL-slug for changes and new entries. add/list/remove; the delta is reported by watch_site list after new_winners or search_sites refreshes the listing.
Inputs: action (required), kind, note, award, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 41 tools
Descriptions are unusually explicit and cross-reference each other ('use search_directory for agencies', 'use verify_build instead', 'this is not the daily site index'), which rescues a lot. Still, several clusters genuinely overlap: analyze_page_structure vs verify_build vs verify_flow, capture_pose_3d vs capture_scene_3d, and the five build_* stub/scaffold tools require careful reading to tell apart.
The dominant pattern is verb_noun in snake_case (analyze_scroll_map, capture_scene_3d, get_site_details, search_elements, build_project, verify_build). Minor deviations exist — new_winners and watch_site abandon the verb-first form, and get_index_status vs get_index_stats are near-identical stems — but the convention is readable throughout.
At 41 tools the surface is heavy for a single server, and the count is inflated by near-parallel variants (build_pose_stub, build_scene_stub, build_gsap_stub, build_motion_manifest, build_project) plus four separate analyze_* censuses. Each tool is documented, but the sheer breadth makes tool selection costly for an agent.
The domain (award-site inspiration plus headless-page evidence and build scaffolding) is covered end to end: discovery, detail, comparison, brief synthesis, motion/structure/a11y/bundle analysis, verification, and project generation. Gaps are minor — no explicit export of comparison reports or watchlist diff payload, and annual/index coverage is partial by design (robots-limited element crawling).
Maintenance
Related MCP Connectors
Let your AI agent build moodboards of real websites: save, search, tag and share design references.
A design agent in your coding agent's loop: briefs each screen, reviews UX and visual quality.
Captured web interfaces, screenshots, flows and structured evidence for AI coding agents.
Find curated website design references, inspect motion and source, and reuse Vault components.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides curated real website design references with structured JSON data on type, spacing, palette, and layout. Enables AI agents to search, browse, and analyze over 1,000 sites and their sections.1MIT
- AlicenseBqualityAmaintenanceEnables coding agents to discover live visual design references, inspect original sites as MCP images, analyze elements and motion, and verify implementation constraints during an original design workflow.17MIT
- AlicenseNot gradedqualityAmaintenanceEnables coding agents building UI to ground their work in real product screens, returning one to three reference screenshots for an unresolved layout, state, or interaction question, plus licensed fonts and icons and the recorded colors, typography, and components behind a chosen web screen. It also serves the bundled design workflow, prompts, and connection diagnostics locally, without a token.MIT
- AlicenseAqualityCmaintenanceEnables AI agents to keyword-search and browse curated UI/UX design inspiration — landing pages, iOS apps, and website templates — and view full-page or per-section screenshots without needing an API key.5MIT





