awwwards-mcp 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +349 -347
  2. package/package.json +19 -1
package/README.md CHANGED
@@ -1,347 +1,349 @@
1
- # awwwards-mcp
2
-
3
- Free, open-source MCP server that gives AI agents design inspiration from
4
- [Awwwards](https://www.awwwards.com/) — the Mobbin-style visual reference loop,
5
- sourced from the web's best award-winning websites.
6
-
7
- Your agent searches in natural language ("dark 3D portfolio sites", "soft pastel
8
- e-commerce"), sees **real screenshots inline**, and can pull the **design DNA**
9
- of any site: color palette, tech stack, design elements, award history.
10
-
11
- ## Tools
12
-
13
- | Tool | What it does |
14
- |------|--------------|
15
- | `search_sites` | Search by color, tags, technology or award type. Returns site cards with inline screenshots. |
16
- | `get_site_details` | Full design DNA for one site: palette, technologies, elements, awards, description. |
17
- | `get_site_elements` | Component-level visuals for one site: each element's poster image inline (3D models, video content, mobile layouts, microcopy…) + video URLs. |
18
- | `list_categories` | Every filter the agent can search by (200+ tags, 27 colors). |
19
- | `capture_live_site` | Optional: fresh full-page screenshot of any live URL. Waits for `load` + a settle window with a bounded pre-scroll, so heavy sites work (`waitStrategy: "networkidle"` available). (needs [playwright](https://playwright.dev)). |
20
- | `analyze_page_structure` | Section band map of any page (live URL or local file:// build): tag, background, offset, height per band. Compare a reference site's structure against your build. Same heavy-site-friendly wait (`waitStrategy: "networkidle"` available). (needs [playwright](https://playwright.dev)). |
21
- | `record_site_motion` | 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. (needs [playwright](https://playwright.dev) + ffmpeg-static). |
22
-
23
- ## Setup
24
-
25
- Any MCP-compatible coding agent can use awwwards-mcp — no API key, no account.
26
- Requires Node ≥ 22.13 (`node -v` to check). Pick your agent:
27
-
28
- **Updates**: the server checks the npm registry once a day and prints an
29
- stderr notice when a newer `awwwards-mcp` exists (stdout stays clean for the
30
- JSON-RPC channel — your agent sees the notice as a log line). Set
31
- `AWWWARDS_AUTO_UPDATE=1` in the server's `env` to opt into background
32
- self-update; restart your agent afterwards to load it. Nothing is fetched
33
- more than once a day and serving never waits on the check.
34
-
35
- **Claude Code**
36
-
37
- ```bash
38
- claude mcp add awwwards -- npx -y awwwards-mcp
39
- ```
40
-
41
- **Codex CLI** (ChatGPT desktop app and the IDE extension share this config)
42
-
43
- ```bash
44
- codex mcp add awwwards -- npx -y awwwards-mcp
45
- ```
46
-
47
- or in `~/.codex/config.toml` (project-scoped: `.codex/config.toml`):
48
-
49
- ```toml
50
- [mcp_servers.awwwards]
51
- command = "npx"
52
- args = ["-y", "awwwards-mcp"]
53
- ```
54
-
55
- **OpenCode** (`opencode.json` — note the command is an array)
56
-
57
- ```json
58
- {
59
- "$schema": "https://opencode.ai/config.json",
60
- "mcp": {
61
- "awwwards": {
62
- "type": "local",
63
- "command": ["npx", "-y", "awwwards-mcp"]
64
- }
65
- }
66
- }
67
- ```
68
-
69
- **ZCode** (`~/.zcode/cli/config.json` — note servers nest under `"mcp": { "servers": ... }`)
70
-
71
- ```json
72
- {
73
- "mcp": {
74
- "servers": {
75
- "awwwards": { "command": "npx", "args": ["-y", "awwwards-mcp"], "env": {} }
76
- }
77
- }
78
- }
79
- ```
80
-
81
- **Claude Desktop / Cursor / Windsurf / Gemini CLI / Cline / Continue** — anything
82
- reading the common `mcpServers` JSON shape (e.g. `~/.claude/claude_desktop_config.json`
83
- or `~/.gemini/settings.json`):
84
-
85
- ```json
86
- {
87
- "mcpServers": {
88
- "awwwards": { "command": "npx", "args": ["-y", "awwwards-mcp"] }
89
- }
90
- }
91
- ```
92
-
93
- **Anything else** — awwwards-mcp is a plain stdio MCP server: point your client
94
- at `npx -y awwwards-mcp` and it works. To pin a version, use
95
- `npx -y awwwards-mcp@1.0.0`.
96
-
97
- **pi coding agent** has no built-in MCP by design — it uses skills and
98
- extensions instead. Two options:
99
-
100
- 1. Install the awwwards-inspiration skill (below). pi reads skills from
101
- `~/.pi/agent/skills/` or `~/.agents/skills/` (the latter is shared across
102
- agents following the Agent Skills standard). The skill teaches the workflow;
103
- for it to reach the live data, add an MCP-supporting pi extension, or run
104
- the queries in another agent and paste results.
105
- 2. Skip MCP entirely: ask pi to build you a small CLI wrapper around
106
- awwwards.com, or use a shared skills directory (`~/.agents/skills/`) so the
107
- same skill file serves pi and every other agent.
108
-
109
- Optional full-page captures (needed by `capture_live_site`,
110
- `analyze_page_structure`, `record_site_motion`):
111
-
112
- ```bash
113
- npm install -g playwright && npx playwright install chromium
114
- ```
115
-
116
- `record_site_motion` additionally uses ffmpeg; it resolves the `ffmpeg-static`
117
- package automatically if present.
118
-
119
- ## Skills
120
-
121
- This package ships three agent skills. Any agent that follows the
122
- [Agent Skills standard](https://agentskills.io) can load them; copy them into
123
- your agent's skills directory:
124
-
125
- ```bash
126
- npm install awwwards-mcp
127
- mkdir -p ~/.agents/skills && cp -r node_modules/awwwards-mcp/skills/awwwards-inspiration node_modules/awwwards-mcp/skills/awwwards-doctor node_modules/awwwards-mcp/skills/awwwards-motion-study ~/.agents/skills/
128
- ```
129
-
130
- | Skill | What it teaches |
131
- |-------|-----------------|
132
- | `awwwards-inspiration` | The inspiration loop: search, judge from screenshots, pull design DNA, state a design direction, capture/motion-first builds. |
133
- | `awwwards-motion-study` | 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. |
134
- | `awwwards-doctor` | Repair: run `npm run doctor`, apply its fixes, re-anchor parsers after real awwwards.com drift, recover the in-flight task that surfaced the failure. |
135
-
136
- | Agent | Skills directory |
137
- |-------|------------------|
138
- | Claude Code | `~/.claude/skills/` |
139
- | pi | `~/.pi/agent/skills/` (also reads `~/.agents/skills/`) |
140
- | ZCode | `~/.zcode/skills/` |
141
- | Agent Skills-standard agents | `~/.agents/skills/` |
142
-
143
- Windows: run this from Git Bash, or copy
144
- `node_modules\awwwards-mcp\skills\awwwards-inspiration` manually.
145
-
146
- ## Indexing (recommended)
147
-
148
- `search_sites` works out of the box, but its depth is limited by polite live
149
- scraping (~31 sites per filter page). Build a local index once and searches
150
- draw from thousands of award-winning sites instantly:
151
-
152
- ```bash
153
- npx -y -p awwwards-mcp awwwards-index # once published
154
- # or, from a local checkout of this repo:
155
- npm run index
156
- ```
157
-
158
- - Crawls all ~200 tag pages at 1 request/second (~4 minutes) into the local
159
- SQLite cache at `~/.awwwards-mcp/`.
160
- - Resumable: interrupt it and re-run — completed pages are skipped.
161
- - The MCP server re-indexes automatically in the background whenever the
162
- index is older than 7 days (never blocking your session).
163
-
164
- Site details (palettes, tech stacks) are still fetched on demand and cached
165
- for 7 days.
166
-
167
- ## How it works
168
-
169
- - Live, polite scraping of awwwards.com public pages (max 1 request/second,
170
- robots.txt-compliant paths only, cached 7 days in SQLite at `~/.awwwards-mcp/`).
171
- - Screenshots are served from Awwwards' own CDN (880×660), cached on disk.
172
- - No API key, no account, no cost.
173
-
174
- ## Ethics & terms
175
-
176
- This tool fetches publicly available pages for **personal design-inspiration
177
- use**, at human-ish request rates, honoring robots.txt. Awwwards' screenshots
178
- and content remain the property of Awwwards and the credited creators — don't
179
- bulk-scrape, redistribute, or republish them. If you use this commercially,
180
- review awwwards.com's terms yourself.
181
-
182
- ## Built with awwwards-mcp: three real sites
183
-
184
- Three complete sites were built through the full inspiration loop this MCP
185
- enables, using nothing but the server's tools plus the shipped
186
- `awwwards-inspiration` skill. Each one exercised a different corner of the
187
- loop — and every correction the loop caught on the way became doctrine in the
188
- skill.
189
-
190
- > **Built in one shot, by a model that can't watch video.** All three sites
191
- > were built in a single prompt run on **GLM 5.3-flash** — which does not
192
- > support video input. The loop's motion study worked entirely from
193
- > frame-tiled filmstrips (ffmpeg, 1–2 fps per element) instead of watching
194
- > the recordings. With a video-native model, those same `get_site_elements`
195
- > videos and `record_site_motion` .webm files could be watched directly —
196
- > timing, easing and overlap read at full fidelity — and the motion-true
197
- > results would be better still. The skill's frame-tile doctrine is what
198
- > closes that gap today.
199
-
200
- **1. [Fallow Press](fallow-press/index.html)**
201
- ([source](fallow-press/)) — a flat-2D editorial journal, direction
202
- **Emergence Magazine** (SOTD): pink `#FF9398` on cream and black, torn-paper
203
- masthead (pure CSS `clip-path`, zero WebGL), giant grotesque display over
204
- grayscale photography, serif-italic brand, three pages with **separate
205
- horizontal** projects/about pages (GSAP ScrollTrigger pin +
206
- `containerAnimation`).
207
-
208
- | Torn-paper masthead (home) | Horizontal gallery (Fields) | Horizontal chapters (Practices) |
209
- |---|---|---|
210
- | ![Fallow Press home — torn-paper masthead over grayscale photography](assets/fallow-home.jpg) | ![Fallow Press Fields — pinned horizontal gallery panel](assets/fallow-fields.jpg) | ![Fallow Press Practices — pink quote chapter](assets/fallow-practices.jpg) |
211
-
212
- The loop as it ran:
213
-
214
- 1. `search_sites` (magazine filters) → shortlist judged from inline
215
- screenshots → `get_site_details` on Emergence Magazine.
216
- 2. **Capture before building**: `capture_live_site` + `record_site_motion`
217
- on the live site *first*; full-page PNG and motion .webm kept in
218
- [fallow-press/ref-motion/](fallow-press/ref-motion/) as the evidence trail.
219
- 3. Build, then verify: full-page capture plus **panel-center pin shots** of
220
- both horizontal pages (13 stops each, in
221
- [fallow-press/_qa/](fallow-press/_qa/) — `capture-qa.mjs` is reusable).
222
- 4. The pin shots caught a real bug: horizontal-panel entrances used
223
- `toggleActions: "play none none reverse"`, and 100vw panels hide content
224
- at midpoints on the way back — copy disappeared mid-view. Fix
225
- (one-shot play entrances) is now doctrine: **full-viewport panels get
226
- one-shot entrances**; QA pin shots land at panel **centers**, not uniform
227
- fractions, or you photograph empty transition zones.
228
-
229
- **2. Cerebrium recreation** (`C:/Users/Afjal/cerebrium-recreation/`) — a
230
- fidelity-first recreation of cerebrium.ai, pixel-checked against the live
231
- reference: full-page captures of both sides, `analyze_page_structure` band
232
- compare, and SVG icon/legend fixes until the build matched the reference to
233
- within 1px of total page height (10,871px vs 10,870px). This is the
234
- **structure-before-pixels** doctrine at its strictest — band maps compared,
235
- never just totals.
236
-
237
- ![Cerebrium recreation — full-page build capture](assets/cerebrium-build.jpg)
238
-
239
- **3. The Meridian** (`C:/Users/Afjal/editorial-site/`) — an editorial journal
240
- built from ORDR/Hearst references: the first build to run the whole loop
241
- end-to-end. `analyze_page_structure` caught a masthead band bug by comparing
242
- the build's band map against the reference's; the reference captures,
243
- motion film, and the reusable pre-scroll capture script live in
244
- `editorial-site/_qa/`.
245
-
246
- ![The Meridian editorial journal — full-page build capture](assets/meridian-build.jpg)
247
-
248
- ![The Meridian — motion filmstrip from record_site_motion](assets/meridian-filmstrip.jpg)
249
-
250
- ## Skills used to build these
251
-
252
- | Skill | Role in the builds |
253
- |---|---|
254
- | `awwwards-inspiration` | The 8-step loop itself (ships with this package): search → judge from screenshots → design DNA → capture/motion study → state direction → build → band-map verify. |
255
- | `gsap-scrolltrigger` | The horizontal pin + `containerAnimation` pattern (ease `"none"`, one-shot entrances) driving both Fallow Press horizontal pages. |
256
- | `gsap-core` / `gsap-timeline` | Tween composition and sequenced hero entrances (torn-paper drop, panel copy rises). |
257
- | `frontend-design` | Typography, palette and layout judgment applied when translating reference DNA into original pages. |
258
- | `lenis` (library, via skill guidance) | smooth scrolling synced to ScrollTrigger on the Fallow Press home page. |
259
- | `tailwindcss` / plain CSS | All builds are plain hand-rolled CSS — flat 2D, no frameworks needed. |
260
-
261
- Reduced-motion, JS-less visits, and capture tools all get graceful fallbacks
262
- (vertical stacks; progressive-enhancement reveals).
263
-
264
- **What the verification loop caught** — proof the structure-before-pixels
265
- doctrine is load-bearing:
266
-
267
- - Element **posters lie**: the first showcase build was designed from poster
268
- frames alone and rendered a spinning 3D ring as *floating static cards*.
269
- Downloading the element videos (`get_site_elements`) and frame-tiling them
270
- revealed the motion truth — now the skill mandates studying motion before
271
- animating.
272
- - Full-page captures of reveal-on-scroll builds showed blank sections: `.reveal`
273
- animation state vs capture's no-scroll reality. Builds ship
274
- content-visible-without-JS progressive enhancement.
275
- - Horizontal-panel copy vanished **mid-view** on the Fallow Press pages:
276
- `toggleActions` reverse reverts entrances while a 100vw panel is still
277
- holding the viewport (see above).
278
- - Band-map compare kept the references' rhythm instead of drifting on
279
- section heights (Cerebrium, The Meridian).
280
-
281
- Prompt counts: **3** for the original showcase build (the build ask, the
282
- motion correction that exposed the poster-lie, the structure pass) and
283
- **1** for Fallow Press ("create a new website using our MCP and skills… no
284
- 3D websites") — its two follow-ups were caught by the QA loop, not by the
285
- user. Each correction became doctrine in the shipped `awwwards-inspiration`
286
- skill: frame-study element videos before animating; judge page architecture
287
- from the studied passages; tile per element, not one giant filmstrip;
288
- capture live sites and animation **before** building.
289
-
290
- ## Can awwwards-mcp crawl the sitemap? (robots.txt notes)
291
-
292
- The awwwards.com `robots.txt` advertises
293
- `Sitemap: https://www.awwwards.com/sitemap.xml` and — verified live
294
- 2026-09-18 — **that sitemap URL returns a soft-404 HTML page** (as do common
295
- child names like `/sitemap-websites.xml`). So sitemap discovery isn't
296
- currently a path to more data; the polite crawl surface is exactly what the
297
- indexer uses:
298
-
299
- - **Allowed and used**: `/websites/`, `/websites/<filter>/`, `/sites/<slug>`
300
- (one filter per URL; deep pagination stays un-crawled).
301
- - **Disallowed and never fetched**: `/tag/`, `/search-websites`,
302
- `/websites/?` (query-string pagination), `/elements/*`, `/vote/`,
303
- favourites/likes/follows, and the rest of the 33 rules.
304
- - Our client (`src/awwwards.ts` `buildFilterUrl`) constructs **only**
305
- `/websites/…` paths at 1 request/second — the loop stays inside the
306
- published rules by construction, not by convention.
307
-
308
- ## Contributing
309
-
310
- PRs welcome! The project especially needs **parser-drift fixes** — when live
311
- awwwards.com markup changes, a fresh HTML snapshot attached to an issue often
312
- becomes the new test fixture and the fastest merged PR. See
313
- [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide:
314
-
315
- **Parser-drift is monitored automatically.** A probe script
316
- ([scripts/parser-drift-probe.mjs](scripts/parser-drift-probe.mjs),
317
- `npm run drift`) checks every markup anchor the parsers depend on — the
318
- `split`/`indexOf`/regex literals in `src/parsers.ts` — against the live
319
- listing and detail pages (2 fetches, 1 request/second, same politeness as
320
- the client). A daily GitHub Action ([.github/workflows/parser-drift.yml](.github/workflows/parser-drift.yml))
321
- runs it and, on drift, opens/updates a single tracking issue with the exact
322
- anchors that changed (and auto-closes it when a later run is green). To run
323
- it yourself: `npm run drift` (live, exit code 0/1/2) or `npm run drift -- --fixture`
324
- (offline, checks the committed fixtures still feed every anchor). Raw HTML
325
- is never diffed or stored — anchors only fire when the parsers actually
326
- break, so there are no false alarms from cosmetic tweaks.
327
-
328
- - Development setup & project layout (offline fixture-tested, no network in tests)
329
- - How to create a PR: fork → `fix/`/`feat/`/`docs/` branch → typecheck + tests → PR template
330
- - The politeness constraints new code must keep (1 req/s, robots.txt paths, light runtime deps)
331
-
332
- Bugs and feature ideas start as
333
- [issues](https://github.com/INSANE0777/Awwwards-mcp/issues/new/choose) with
334
- templates. Security problems go privately — see
335
- [SECURITY.md](SECURITY.md). By participating you agree to the
336
- [Code of Conduct](CODE_OF_CONDUCT.md).
337
-
338
- ## Development
339
-
340
- ```bash
341
- npm install
342
- npm test # offline unit tests against committed HTML fixtures
343
- npm run smoke # manual live smoke test against awwwards.com
344
- npm run build # compile to dist/
345
- ```
346
-
347
- MIT — see [LICENSE](LICENSE).
1
+ # awwwards-mcp
2
+
3
+ Free, open-source MCP server that gives AI agents design inspiration from
4
+ [Awwwards](https://www.awwwards.com/) — the Mobbin-style visual reference loop,
5
+ sourced from the web's best award-winning websites.
6
+
7
+ <a href="https://github.com/INSANE0777/Awwwards-mcp"><img src="assets/demo.gif" alt="awwwards-mcp in action: search results, design DNA, motion filmstrip, band map — real tool output" width="480"></a>
8
+
9
+ Your agent searches in natural language ("dark 3D portfolio sites", "soft pastel
10
+ e-commerce"), sees **real screenshots inline**, and can pull the **design DNA**
11
+ of any site: color palette, tech stack, design elements, award history.
12
+
13
+ ## Tools
14
+
15
+ | Tool | What it does |
16
+ |------|--------------|
17
+ | `search_sites` | Search by color, tags, technology or award type. Returns site cards with inline screenshots. |
18
+ | `get_site_details` | Full design DNA for one site: palette, technologies, elements, awards, description. |
19
+ | `get_site_elements` | Component-level visuals for one site: each element's poster image inline (3D models, video content, mobile layouts, microcopy…) + video URLs. |
20
+ | `list_categories` | Every filter the agent can search by (200+ tags, 27 colors). |
21
+ | `capture_live_site` | Optional: fresh full-page screenshot of any live URL. Waits for `load` + a settle window with a bounded pre-scroll, so heavy sites work (`waitStrategy: "networkidle"` available). (needs [playwright](https://playwright.dev)). |
22
+ | `analyze_page_structure` | Section band map of any page (live URL or local file:// build): tag, background, offset, height per band. Compare a reference site's structure against your build. Same heavy-site-friendly wait (`waitStrategy: "networkidle"` available). (needs [playwright](https://playwright.dev)). |
23
+ | `record_site_motion` | 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. (needs [playwright](https://playwright.dev) + ffmpeg-static). |
24
+
25
+ ## Setup
26
+
27
+ Any MCP-compatible coding agent can use awwwards-mcp — no API key, no account.
28
+ Requires Node ≥ 22.13 (`node -v` to check). Pick your agent:
29
+
30
+ **Updates**: the server checks the npm registry once a day and prints an
31
+ stderr notice when a newer `awwwards-mcp` exists (stdout stays clean for the
32
+ JSON-RPC channel — your agent sees the notice as a log line). Set
33
+ `AWWWARDS_AUTO_UPDATE=1` in the server's `env` to opt into background
34
+ self-update; restart your agent afterwards to load it. Nothing is fetched
35
+ more than once a day and serving never waits on the check.
36
+
37
+ **Claude Code**
38
+
39
+ ```bash
40
+ claude mcp add awwwards -- npx -y awwwards-mcp
41
+ ```
42
+
43
+ **Codex CLI** (ChatGPT desktop app and the IDE extension share this config)
44
+
45
+ ```bash
46
+ codex mcp add awwwards -- npx -y awwwards-mcp
47
+ ```
48
+
49
+ or in `~/.codex/config.toml` (project-scoped: `.codex/config.toml`):
50
+
51
+ ```toml
52
+ [mcp_servers.awwwards]
53
+ command = "npx"
54
+ args = ["-y", "awwwards-mcp"]
55
+ ```
56
+
57
+ **OpenCode** (`opencode.json` — note the command is an array)
58
+
59
+ ```json
60
+ {
61
+ "$schema": "https://opencode.ai/config.json",
62
+ "mcp": {
63
+ "awwwards": {
64
+ "type": "local",
65
+ "command": ["npx", "-y", "awwwards-mcp"]
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ **ZCode** (`~/.zcode/cli/config.json` — note servers nest under `"mcp": { "servers": ... }`)
72
+
73
+ ```json
74
+ {
75
+ "mcp": {
76
+ "servers": {
77
+ "awwwards": { "command": "npx", "args": ["-y", "awwwards-mcp"], "env": {} }
78
+ }
79
+ }
80
+ }
81
+ ```
82
+
83
+ **Claude Desktop / Cursor / Windsurf / Gemini CLI / Cline / Continue** — anything
84
+ reading the common `mcpServers` JSON shape (e.g. `~/.claude/claude_desktop_config.json`
85
+ or `~/.gemini/settings.json`):
86
+
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "awwwards": { "command": "npx", "args": ["-y", "awwwards-mcp"] }
91
+ }
92
+ }
93
+ ```
94
+
95
+ **Anything else** — awwwards-mcp is a plain stdio MCP server: point your client
96
+ at `npx -y awwwards-mcp` and it works. To pin a version, use
97
+ `npx -y awwwards-mcp@1.0.0`.
98
+
99
+ **pi coding agent** has no built-in MCP by design — it uses skills and
100
+ extensions instead. Two options:
101
+
102
+ 1. Install the awwwards-inspiration skill (below). pi reads skills from
103
+ `~/.pi/agent/skills/` or `~/.agents/skills/` (the latter is shared across
104
+ agents following the Agent Skills standard). The skill teaches the workflow;
105
+ for it to reach the live data, add an MCP-supporting pi extension, or run
106
+ the queries in another agent and paste results.
107
+ 2. Skip MCP entirely: ask pi to build you a small CLI wrapper around
108
+ awwwards.com, or use a shared skills directory (`~/.agents/skills/`) so the
109
+ same skill file serves pi and every other agent.
110
+
111
+ Optional full-page captures (needed by `capture_live_site`,
112
+ `analyze_page_structure`, `record_site_motion`):
113
+
114
+ ```bash
115
+ npm install -g playwright && npx playwright install chromium
116
+ ```
117
+
118
+ `record_site_motion` additionally uses ffmpeg; it resolves the `ffmpeg-static`
119
+ package automatically if present.
120
+
121
+ ## Skills
122
+
123
+ This package ships three agent skills. Any agent that follows the
124
+ [Agent Skills standard](https://agentskills.io) can load them; copy them into
125
+ your agent's skills directory:
126
+
127
+ ```bash
128
+ npm install awwwards-mcp
129
+ mkdir -p ~/.agents/skills && cp -r node_modules/awwwards-mcp/skills/awwwards-inspiration node_modules/awwwards-mcp/skills/awwwards-doctor node_modules/awwwards-mcp/skills/awwwards-motion-study ~/.agents/skills/
130
+ ```
131
+
132
+ | Skill | What it teaches |
133
+ |-------|-----------------|
134
+ | `awwwards-inspiration` | The inspiration loop: search, judge from screenshots, pull design DNA, state a design direction, capture/motion-first builds. |
135
+ | `awwwards-motion-study` | 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. |
136
+ | `awwwards-doctor` | Repair: run `npm run doctor`, apply its fixes, re-anchor parsers after real awwwards.com drift, recover the in-flight task that surfaced the failure. |
137
+
138
+ | Agent | Skills directory |
139
+ |-------|------------------|
140
+ | Claude Code | `~/.claude/skills/` |
141
+ | pi | `~/.pi/agent/skills/` (also reads `~/.agents/skills/`) |
142
+ | ZCode | `~/.zcode/skills/` |
143
+ | Agent Skills-standard agents | `~/.agents/skills/` |
144
+
145
+ Windows: run this from Git Bash, or copy
146
+ `node_modules\awwwards-mcp\skills\awwwards-inspiration` manually.
147
+
148
+ ## Indexing (recommended)
149
+
150
+ `search_sites` works out of the box, but its depth is limited by polite live
151
+ scraping (~31 sites per filter page). Build a local index once and searches
152
+ draw from thousands of award-winning sites instantly:
153
+
154
+ ```bash
155
+ npx -y -p awwwards-mcp awwwards-index # once published
156
+ # or, from a local checkout of this repo:
157
+ npm run index
158
+ ```
159
+
160
+ - Crawls all ~200 tag pages at 1 request/second (~4 minutes) into the local
161
+ SQLite cache at `~/.awwwards-mcp/`.
162
+ - Resumable: interrupt it and re-run — completed pages are skipped.
163
+ - The MCP server re-indexes automatically in the background whenever the
164
+ index is older than 7 days (never blocking your session).
165
+
166
+ Site details (palettes, tech stacks) are still fetched on demand and cached
167
+ for 7 days.
168
+
169
+ ## How it works
170
+
171
+ - Live, polite scraping of awwwards.com public pages (max 1 request/second,
172
+ robots.txt-compliant paths only, cached 7 days in SQLite at `~/.awwwards-mcp/`).
173
+ - Screenshots are served from Awwwards' own CDN (880×660), cached on disk.
174
+ - No API key, no account, no cost.
175
+
176
+ ## Ethics & terms
177
+
178
+ This tool fetches publicly available pages for **personal design-inspiration
179
+ use**, at human-ish request rates, honoring robots.txt. Awwwards' screenshots
180
+ and content remain the property of Awwwards and the credited creators — don't
181
+ bulk-scrape, redistribute, or republish them. If you use this commercially,
182
+ review awwwards.com's terms yourself.
183
+
184
+ ## Built with awwwards-mcp: three real sites
185
+
186
+ Three complete sites were built through the full inspiration loop this MCP
187
+ enables, using nothing but the server's tools plus the shipped
188
+ `awwwards-inspiration` skill. Each one exercised a different corner of the
189
+ loop — and every correction the loop caught on the way became doctrine in the
190
+ skill.
191
+
192
+ > **Built in one shot, by a model that can't watch video.** All three sites
193
+ > were built in a single prompt run on **GLM 5.3-flash** — which does not
194
+ > support video input. The loop's motion study worked entirely from
195
+ > frame-tiled filmstrips (ffmpeg, 1–2 fps per element) instead of watching
196
+ > the recordings. With a video-native model, those same `get_site_elements`
197
+ > videos and `record_site_motion` .webm files could be watched directly —
198
+ > timing, easing and overlap read at full fidelity — and the motion-true
199
+ > results would be better still. The skill's frame-tile doctrine is what
200
+ > closes that gap today.
201
+
202
+ **1. [Fallow Press](fallow-press/index.html)**
203
+ ([source](fallow-press/)) — a flat-2D editorial journal, direction
204
+ **Emergence Magazine** (SOTD): pink `#FF9398` on cream and black, torn-paper
205
+ masthead (pure CSS `clip-path`, zero WebGL), giant grotesque display over
206
+ grayscale photography, serif-italic brand, three pages with **separate
207
+ horizontal** projects/about pages (GSAP ScrollTrigger pin +
208
+ `containerAnimation`).
209
+
210
+ | Torn-paper masthead (home) | Horizontal gallery (Fields) | Horizontal chapters (Practices) |
211
+ |---|---|---|
212
+ | ![Fallow Press home — torn-paper masthead over grayscale photography](assets/fallow-home.jpg) | ![Fallow Press Fields — pinned horizontal gallery panel](assets/fallow-fields.jpg) | ![Fallow Press Practices — pink quote chapter](assets/fallow-practices.jpg) |
213
+
214
+ The loop as it ran:
215
+
216
+ 1. `search_sites` (magazine filters) → shortlist judged from inline
217
+ screenshots → `get_site_details` on Emergence Magazine.
218
+ 2. **Capture before building**: `capture_live_site` + `record_site_motion`
219
+ on the live site *first*; full-page PNG and motion .webm kept in
220
+ [fallow-press/ref-motion/](fallow-press/ref-motion/) as the evidence trail.
221
+ 3. Build, then verify: full-page capture plus **panel-center pin shots** of
222
+ both horizontal pages (13 stops each, in
223
+ [fallow-press/_qa/](fallow-press/_qa/) — `capture-qa.mjs` is reusable).
224
+ 4. The pin shots caught a real bug: horizontal-panel entrances used
225
+ `toggleActions: "play none none reverse"`, and 100vw panels hide content
226
+ at midpoints on the way back — copy disappeared mid-view. Fix
227
+ (one-shot play entrances) is now doctrine: **full-viewport panels get
228
+ one-shot entrances**; QA pin shots land at panel **centers**, not uniform
229
+ fractions, or you photograph empty transition zones.
230
+
231
+ **2. Cerebrium recreation** (`C:/Users/Afjal/cerebrium-recreation/`) — a
232
+ fidelity-first recreation of cerebrium.ai, pixel-checked against the live
233
+ reference: full-page captures of both sides, `analyze_page_structure` band
234
+ compare, and SVG icon/legend fixes until the build matched the reference to
235
+ within 1px of total page height (10,871px vs 10,870px). This is the
236
+ **structure-before-pixels** doctrine at its strictest — band maps compared,
237
+ never just totals.
238
+
239
+ ![Cerebrium recreation — full-page build capture](assets/cerebrium-build.jpg)
240
+
241
+ **3. The Meridian** (`C:/Users/Afjal/editorial-site/`) — an editorial journal
242
+ built from ORDR/Hearst references: the first build to run the whole loop
243
+ end-to-end. `analyze_page_structure` caught a masthead band bug by comparing
244
+ the build's band map against the reference's; the reference captures,
245
+ motion film, and the reusable pre-scroll capture script live in
246
+ `editorial-site/_qa/`.
247
+
248
+ ![The Meridian editorial journal — full-page build capture](assets/meridian-build.jpg)
249
+
250
+ ![The Meridian — motion filmstrip from record_site_motion](assets/meridian-filmstrip.jpg)
251
+
252
+ ## Skills used to build these
253
+
254
+ | Skill | Role in the builds |
255
+ |---|---|
256
+ | `awwwards-inspiration` | The 8-step loop itself (ships with this package): search → judge from screenshots → design DNA → capture/motion study → state direction → build → band-map verify. |
257
+ | `gsap-scrolltrigger` | The horizontal pin + `containerAnimation` pattern (ease `"none"`, one-shot entrances) driving both Fallow Press horizontal pages. |
258
+ | `gsap-core` / `gsap-timeline` | Tween composition and sequenced hero entrances (torn-paper drop, panel copy rises). |
259
+ | `frontend-design` | Typography, palette and layout judgment applied when translating reference DNA into original pages. |
260
+ | `lenis` (library, via skill guidance) | smooth scrolling synced to ScrollTrigger on the Fallow Press home page. |
261
+ | `tailwindcss` / plain CSS | All builds are plain hand-rolled CSS — flat 2D, no frameworks needed. |
262
+
263
+ Reduced-motion, JS-less visits, and capture tools all get graceful fallbacks
264
+ (vertical stacks; progressive-enhancement reveals).
265
+
266
+ **What the verification loop caught** — proof the structure-before-pixels
267
+ doctrine is load-bearing:
268
+
269
+ - Element **posters lie**: the first showcase build was designed from poster
270
+ frames alone and rendered a spinning 3D ring as *floating static cards*.
271
+ Downloading the element videos (`get_site_elements`) and frame-tiling them
272
+ revealed the motion truth — now the skill mandates studying motion before
273
+ animating.
274
+ - Full-page captures of reveal-on-scroll builds showed blank sections: `.reveal`
275
+ animation state vs capture's no-scroll reality. Builds ship
276
+ content-visible-without-JS progressive enhancement.
277
+ - Horizontal-panel copy vanished **mid-view** on the Fallow Press pages:
278
+ `toggleActions` reverse reverts entrances while a 100vw panel is still
279
+ holding the viewport (see above).
280
+ - Band-map compare kept the references' rhythm instead of drifting on
281
+ section heights (Cerebrium, The Meridian).
282
+
283
+ Prompt counts: **3** for the original showcase build (the build ask, the
284
+ motion correction that exposed the poster-lie, the structure pass) and
285
+ **1** for Fallow Press ("create a new website using our MCP and skills… no
286
+ 3D websites") — its two follow-ups were caught by the QA loop, not by the
287
+ user. Each correction became doctrine in the shipped `awwwards-inspiration`
288
+ skill: frame-study element videos before animating; judge page architecture
289
+ from the studied passages; tile per element, not one giant filmstrip;
290
+ capture live sites and animation **before** building.
291
+
292
+ ## Can awwwards-mcp crawl the sitemap? (robots.txt notes)
293
+
294
+ The awwwards.com `robots.txt` advertises
295
+ `Sitemap: https://www.awwwards.com/sitemap.xml` and — verified live
296
+ 2026-09-18 — **that sitemap URL returns a soft-404 HTML page** (as do common
297
+ child names like `/sitemap-websites.xml`). So sitemap discovery isn't
298
+ currently a path to more data; the polite crawl surface is exactly what the
299
+ indexer uses:
300
+
301
+ - **Allowed and used**: `/websites/`, `/websites/<filter>/`, `/sites/<slug>`
302
+ (one filter per URL; deep pagination stays un-crawled).
303
+ - **Disallowed and never fetched**: `/tag/`, `/search-websites`,
304
+ `/websites/?` (query-string pagination), `/elements/*`, `/vote/`,
305
+ favourites/likes/follows, and the rest of the 33 rules.
306
+ - Our client (`src/awwwards.ts` `buildFilterUrl`) constructs **only**
307
+ `/websites/…` paths at 1 request/second — the loop stays inside the
308
+ published rules by construction, not by convention.
309
+
310
+ ## Contributing
311
+
312
+ PRs welcome! The project especially needs **parser-drift fixes** — when live
313
+ awwwards.com markup changes, a fresh HTML snapshot attached to an issue often
314
+ becomes the new test fixture and the fastest merged PR. See
315
+ [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide:
316
+
317
+ **Parser-drift is monitored automatically.** A probe script
318
+ ([scripts/parser-drift-probe.mjs](scripts/parser-drift-probe.mjs),
319
+ `npm run drift`) checks every markup anchor the parsers depend on — the
320
+ `split`/`indexOf`/regex literals in `src/parsers.ts` — against the live
321
+ listing and detail pages (2 fetches, 1 request/second, same politeness as
322
+ the client). A daily GitHub Action ([.github/workflows/parser-drift.yml](.github/workflows/parser-drift.yml))
323
+ runs it and, on drift, opens/updates a single tracking issue with the exact
324
+ anchors that changed (and auto-closes it when a later run is green). To run
325
+ it yourself: `npm run drift` (live, exit code 0/1/2) or `npm run drift -- --fixture`
326
+ (offline, checks the committed fixtures still feed every anchor). Raw HTML
327
+ is never diffed or stored — anchors only fire when the parsers actually
328
+ break, so there are no false alarms from cosmetic tweaks.
329
+
330
+ - Development setup & project layout (offline fixture-tested, no network in tests)
331
+ - How to create a PR: fork → `fix/`/`feat/`/`docs/` branch → typecheck + tests → PR template
332
+ - The politeness constraints new code must keep (1 req/s, robots.txt paths, light runtime deps)
333
+
334
+ Bugs and feature ideas start as
335
+ [issues](https://github.com/INSANE0777/Awwwards-mcp/issues/new/choose) with
336
+ templates. Security problems go privately — see
337
+ [SECURITY.md](SECURITY.md). By participating you agree to the
338
+ [Code of Conduct](CODE_OF_CONDUCT.md).
339
+
340
+ ## Development
341
+
342
+ ```bash
343
+ npm install
344
+ npm test # offline unit tests against committed HTML fixtures
345
+ npm run smoke # manual live smoke test against awwwards.com
346
+ npm run build # compile to dist/
347
+ ```
348
+
349
+ MIT — see [LICENSE](LICENSE).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awwwards-mcp",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Free MCP server giving AI agents design inspiration from Awwwards: search award-winning sites with inline screenshots and extract design DNA.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -13,6 +13,24 @@
13
13
  "README.md",
14
14
  "skills"
15
15
  ],
16
+ "keywords": [
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "awwwards",
20
+ "design",
21
+ "inspiration",
22
+ "web-design",
23
+ "screenshots",
24
+ "agent-tools"
25
+ ],
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/INSANE0777/Awwwards-mcp.git"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/INSANE0777/Awwwards-mcp/issues"
32
+ },
33
+ "homepage": "https://github.com/INSANE0777/Awwwards-mcp#readme",
16
34
  "engines": {
17
35
  "node": ">=22.13.0"
18
36
  },