aura-components-mcp 1.7.2 → 1.7.3
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.
- package/CHANGELOG.md +53 -1
- package/README.md +19 -10
- package/SETUP.md +4 -2
- package/dist/server.js +762 -219
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,59 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `aura-components-mcp`.
|
|
4
4
|
|
|
5
|
-
## [
|
|
5
|
+
## [1.7.3] — 2026-10-18
|
|
6
|
+
|
|
7
|
+
Hardening pass over the six award tools and shared infrastructure. No public
|
|
8
|
+
tool/contract changes, no new dependencies. Test suite: 275 hermetic
|
|
9
|
+
(226 before + 49 new) + 45 live checks green.
|
|
10
|
+
|
|
11
|
+
### Security
|
|
12
|
+
|
|
13
|
+
- Fixed `awardParseIpv6` compressed-form (`::`) fill count: every compressed
|
|
14
|
+
IPv6 was classified invalid, which mis-blocked public AAAA/dual-stack hosts
|
|
15
|
+
and broke `[::1]` under `allowLocal`. Classification now matches the literal
|
|
16
|
+
ranges (`::1` loopback, `fe80::/10`, `fc00::/7`, …), and `[::ffff:127.0.0.1]`
|
|
17
|
+
counts as loopback while mapped private/link-local/metadata addresses stay
|
|
18
|
+
blocked.
|
|
19
|
+
- All award HTML fetches (search, inspect, index crawl, static audit) run
|
|
20
|
+
through one guarded client: scheme + literal host policy, bounded best-effort
|
|
21
|
+
DNS check (positive-blocking only, ~1.5 s cap), redirect targets re-validated,
|
|
22
|
+
streamed body size cap (`/exceeds/`), 404 → `NOT_FOUND`, 429 → no retry.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- `aura_award_index` lifecycle: `rebuild` continues an unfinished same-plan
|
|
27
|
+
cycle and starts a new cycle only after completion; `resume` finishes
|
|
28
|
+
pending work and then returns an explicit complete no-op; `refresh` starts a
|
|
29
|
+
new cycle only after lock acquisition; `maxPages` (1–20) is enforced inside
|
|
30
|
+
the index layer as a per-call fetch budget.
|
|
31
|
+
- `new_winners` drift guard: an empty/failed upstream listing returns
|
|
32
|
+
`degraded: true` + parser stamp and never overwrites a non-empty baseline;
|
|
33
|
+
filtered-empty listings never count as empty; a genuinely empty but
|
|
34
|
+
understood listing on a fresh index seeds an explicit empty baseline.
|
|
35
|
+
- Watches: `kind:"url"` records normalize canonical `/sites/<slug>` URLs or
|
|
36
|
+
bare slugs; legacy raw-URL records still match at check time and
|
|
37
|
+
`watch_remove` accepts either form.
|
|
38
|
+
- Browser flows: after navigation settles the page URL is re-checked
|
|
39
|
+
(`location.href`, http(s) only); blocked/non-http(s) targets abort with
|
|
40
|
+
`UNSUPPORTED_OPERATION` + `blockedUrl` instead of reading page state.
|
|
41
|
+
- Artifact honesty: `capture` reports `artifactPath` only when the file was
|
|
42
|
+
actually written (`artifactNote` otherwise) and prunes old temp captures
|
|
43
|
+
(newest 20 kept) with a `retentionNote`; `recordFrames` prunes
|
|
44
|
+
`aura-motion-*` dirs older than 24 h; `encodeWebm` validates frames first
|
|
45
|
+
and reports `framesUsed`.
|
|
46
|
+
- `aura_design_blueprint` confidence gains its motion point only from recorded
|
|
47
|
+
motion studies (`motionRecorded: true`) — static markup cues never raise it.
|
|
48
|
+
- `aura_visual_audit` capture/motion rethrow `BROWSER_UNAVAILABLE` /
|
|
49
|
+
`UNSUPPORTED_OPERATION` instead of degrading to static estimates (browserless
|
|
50
|
+
modes still degrade, with `fallbackFrom`/`fallbackWhy`).
|
|
51
|
+
|
|
52
|
+
### Tests
|
|
53
|
+
|
|
54
|
+
- 6 new hermetic suites (49 checks): URL/IPv6 security matrix, bounded client
|
|
55
|
+
limits, index lifecycle (resume/refresh/lock), watch normalization, output
|
|
56
|
+
quality (confidence/notes/fragments), artifact retention + `encodeWebm`
|
|
57
|
+
validation. 275 hermetic total, all green.
|
|
6
58
|
|
|
7
59
|
## [1.7.2] — 2026-10-15
|
|
8
60
|
|
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
<
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/swastiksingh-dev/Aura-Components-MCP/main/assets/banner.png" alt="Aura Components MCP — every free thing on aura.build, one stdio call away. 2,495 components · 192 skills · 30,688 assets · 725 design systems · 35 tools · zero dependencies.">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
5
|
<p align="center"><sub>FREE MCP SERVER · STDIO · ZERO DEPS · MIT</sub></p>
|
|
4
6
|
|
|
@@ -9,6 +11,7 @@
|
|
|
9
11
|
<a href="https://github.com/swastiksingh-dev/Aura-Components-MCP/blob/main/package.json"><img src="https://img.shields.io/badge/node-%3E%3D22-brightgreen" alt="node >= 22"></a>
|
|
10
12
|
<a href="https://github.com/swastiksingh-dev/Aura-Components-MCP/blob/main/dist/server.js"><img src="https://img.shields.io/badge/MCP-stdio-blue" alt="MCP stdio"></a>
|
|
11
13
|
<a href="#the-35-tools"><img src="https://img.shields.io/badge/tools-35-blueviolet" alt="35 tools"></a>
|
|
14
|
+
<a href="#develop"><img src="https://img.shields.io/badge/live_checks-45-brightgreen" alt="45 live checks"></a>
|
|
12
15
|
<a href="https://github.com/swastiksingh-dev/Aura-Components-MCP/actions"><img src="https://github.com/swastiksingh-dev/Aura-Components-MCP/actions/workflows/verify.yml/badge.svg" alt="verify CI"></a>
|
|
13
16
|
<a href="https://github.com/swastiksingh-dev/Aura-Components-MCP"><img src="https://img.shields.io/github/stars/swastiksingh-dev/Aura-Components-MCP?style=social" alt="GitHub stars"></a>
|
|
14
17
|
</p>
|
|
@@ -31,7 +34,7 @@
|
|
|
31
34
|
|
|
32
35
|
<p align="center">
|
|
33
36
|
<b>2,495</b> free components · <b>192</b> skills · <b>30,688</b> assets · <b>725</b> design systems<br>
|
|
34
|
-
<b>35</b> tools · <b>0</b> dependencies · <b>
|
|
37
|
+
<b>35</b> tools · <b>0</b> dependencies · <b>275</b> hermetic tests + <b>45</b> live checks green · version-checked hourly against npm
|
|
35
38
|
</p>
|
|
36
39
|
|
|
37
40
|
---
|
|
@@ -49,8 +52,15 @@
|
|
|
49
52
|
- [Develop](#develop)
|
|
50
53
|
- [Credits](#credits)
|
|
51
54
|
|
|
55
|
+
> **v1.7.3** — hardening release, no new tools, no new dependencies. The whole award layer now fetches through one guarded path (scheme/host/DNS policy, re-checked redirects, size-capped bodies) plus the IPv6 parser fix that had mis-blocked public AAAA/dual-stack hosts. Plan-based index lifecycle (`rebuild` continues, `resume` finishes, `refresh` forces), drift-guarded winner baselines that an empty listing can't wipe, normalized URL watches, and artifact-honest capture/motion. 49 new hermetic tests lock it in: **275 hermetic + 45 live checks, all green**.
|
|
56
|
+
|
|
57
|
+
<details>
|
|
58
|
+
<summary><b>v1.7.1 changelog</b> — click to expand</summary>
|
|
59
|
+
|
|
52
60
|
> **v1.7.1** — bug-fix release, no new tools. Central free-only enforcement: Pro components/assets by direct ID are now refused (`-32602`, fail-closed on ambiguous entitlement) instead of returned in full — search, install, bundle, scaffold, and related all inherit it. Search cache isolates explicit `theme` (dark/light no longer share entries). Bundles honor all 8 refs end-to-end with `dropped_refs` disclosure. New `min_views_filtered_out` count (`total` stays upstream). Full icon outages surface as upstream errors, not misses. Upstream hardening: malformed rows disclosed via `malformed_dropped` (single fetch fails loud), non-429 4xx never retried. Node floor raised to maintained releases (engines `>=22`, CI matrix 22.x/24.x). Dead code removed, scaffold merge extracted, verify extended.
|
|
53
61
|
|
|
62
|
+
</details>
|
|
63
|
+
|
|
54
64
|
<details>
|
|
55
65
|
<summary><b>v1.7.0 changelog (29 tools)</b> — click to expand</summary>
|
|
56
66
|
|
|
@@ -113,7 +123,7 @@ node ./dist/server.js
|
|
|
113
123
|
```
|
|
114
124
|
|
|
115
125
|
```bash
|
|
116
|
-
# Option B — npm
|
|
126
|
+
# Option B — npm
|
|
117
127
|
npm i -g aura-components-mcp
|
|
118
128
|
aura-components-mcp
|
|
119
129
|
```
|
|
@@ -214,7 +224,6 @@ Start with `aura_status`, then `aura_search_all`. That order matters: status con
|
|
|
214
224
|
| `aura_docs_check` | Pasted code vs fresh docs (pure): verdict current\|needs-update, look-preserving fixes, pin checks. |
|
|
215
225
|
| `aura_icon` | One free icon as ready SVG (live): FA Free + HackerNoon pixel lib, auto-fallback, license + credit always, font alternative, 24h cache. |
|
|
216
226
|
| `aura_version` | Running vs npm-published version (live, hourly cache). `update_available` + prefer-latest notice. `aura_status` carries the verdict on every call. |
|
|
217
|
-
| `aura_version` | Running vs npm-published version (live, hourly cache). `update_available` + prefer-latest notice. `aura_status` carries the verdict on every call. |
|
|
218
227
|
|
|
219
228
|
### Award intelligence (new in v1.7.2 — 6 tools, zero npm deps)
|
|
220
229
|
|
|
@@ -226,9 +235,9 @@ browser; live capture needs Chrome (see setup below).
|
|
|
226
235
|
| `aura_award_search` | `sites` / `categories` / `elements` / `motion` | Ranked Awwwards refs (title, source URL, tags, awards, studio, preview link, relevance + reasons). Multiword queries get alias expansion (`glassy`→`glassmorphism`, `3d`→`webgl`) plus a `theme:dark/light` boost — reasons always name your word, never the alias. `categories` returns real taxonomy from the index/source, filters paged by `limit`/`offset` (`filtersTotal` tells the full size). `motion` searches stored studies (`emptyCorpus:true` when none recorded yet). Every response carries `source` + `corpusNote`: first run on an empty index seeds from one polite live fetch (`source:live`); after that everything ranks from the local index until you `rebuild`/`refresh`. Empty results carry `suggestions`; upstream failures carry `liveError` instead of fake hits. |
|
|
227
236
|
| `aura_award_inspect` | `site_details` / `site_elements` / `element` / `compare_sites` | Design DNA (palette, tech, elements, awards, score). Empty Technologies sections are backfilled from listing tags and labeled `technologiesInferred:true` (never presented as parsed). Rule-based `ideas` (0–6 by evidence, always `status:suggested` + observed `basis`, contract in `ideas_contract`). Browserless motion evidence in `motion_static` (scripts, keyframes, scroll cues — labeled static-markup, never runtime). Element media URLs with attribution. 2–3-site comparisons with shared signals, fuzzy element-keyword overlap, tech-family canonicalization, luminance-band agreement, `directionHints`, and gaps (missing = unknown, never negative proof). |
|
|
228
237
|
| `aura_design_blueprint` | goal + 2–5 refs | Markdown brief + versioned JSON (`spec.version: 1`): shared patterns, outliers, palette evidence, one catalogue query PER proposed section (tokens/hero/proof/…/footer, capped at 12 matches — slim rows, not full code dumps), real free Aura matches (IDs + page URLs, free-only enforced, fallback-sourced rows marked `(via fallback …)` with `matchEvidence`), requested hexes from your goal synthesized as `proposed` tokens against the refs' observed bands, executable `next_calls` (get/scaffold/motion with real gathered IDs), evidence-scored `confidence` + `confidenceWhy`, sections, motion/a11y/performance guidance, checklist, and an always-present Evidence gaps section. Catalogue failures surface as unavailable evidence. |
|
|
229
|
-
| `aura_visual_audit` | `capture` / `structure` / `compare` | Real browser screenshots + live-DOM band maps when Chrome works (`source: live-browser`, attached via `/json/list` page targets). Any live-dom failure degrades to labeled `static-html` estimates (`fallbackFrom` + `fallbackWhy` disclosed) instead of erroring. Local builds: pass a `file://` path or local file with `allowLocal:true` for direct file estimates (`source: local-file`); screenshots still need a served `http://127.0.0.1` URL. `compare` reports section-count/order, height, palette mismatches + manual-judgment items, with an `estimateNote` when offsets aren't measured. |
|
|
230
|
-
| `aura_motion_study` | `inspect` / `record` / `search` | Live runtime scans (libs, easing vocab, scroll model, ScrollTrigger counts — only what was observed), bounded frame studies (2–16 frames, ≤30s), `.webm` only when system ffmpeg exists. Stored studies are searchable by library/easing/scroll. |
|
|
231
|
-
| `aura_award_index` | `status` / `rebuild` / `resume` / `refresh` / `new_winners` / `watch_add` / `watch_list` / `watch_remove` | Persistent corpus in `~/.aura-mcp/awards` (`AURA_AWARDS_DIR` overrides): counts/freshness/lock, polite ~1 req/s crawl bounded by `maxPages` (default 5, max 20
|
|
238
|
+
| `aura_visual_audit` | `capture` / `structure` / `compare` | Real browser screenshots + live-DOM band maps when Chrome works (`source: live-browser`, attached via `/json/list` page targets). Any live-dom failure degrades to labeled `static-html` estimates (`fallbackFrom` + `fallbackWhy` disclosed) instead of erroring. Local builds: pass a `file://` path or local file with `allowLocal:true` for direct file estimates (`source: local-file`); screenshots still need a served `http://127.0.0.1` URL. `compare` reports section-count/order, height, palette mismatches + manual-judgment items, with an `estimateNote` when offsets aren't measured. Capture never claims an `artifactPath` it didn't write (see `artifactNote`) and prunes old temp captures (newest 20 kept) with a `retentionNote` when no `saveDir` is set; a navigation to a blocked/non-http(s) URL after settle aborts with `UNSUPPORTED_OPERATION` + `blockedUrl`. |
|
|
239
|
+
| `aura_motion_study` | `inspect` / `record` / `search` | Live runtime scans (libs, easing vocab, scroll model, ScrollTrigger counts — only what was observed), bounded frame studies (2–16 frames, ≤30s), `.webm` only when system ffmpeg exists. Stored studies are searchable by library/easing/scroll. `record` validates frames before encoding and reports `framesUsed`; temp `aura-motion-*` dirs older than 24h are pruned with a `retentionNote` when no `saveDir` is set. |
|
|
240
|
+
| `aura_award_index` | `status` / `rebuild` / `resume` / `refresh` / `new_winners` / `watch_add` / `watch_list` / `watch_remove` | Persistent corpus in `~/.aura-mcp/awards` (`AURA_AWARDS_DIR` overrides): counts/freshness/lock, polite ~1 req/s crawl bounded by `maxPages` per call (default 5, max 20). `rebuild` continues an unfinished cycle (starts a new one after completion), `resume` finishes pending work, `refresh` forces a new crawl. Winner baseline-then-delta is drift-guarded (an empty upstream listing reports `degraded:true` instead of overwriting the baseline). Watches accept studio/tag or canonical `/sites/<slug>` URLs/slugs (legacy raw URLs still match). Never auto-crawls on startup. |
|
|
232
241
|
|
|
233
242
|
**Browser setup (optional, capture/motion only):** install Chrome/Chromium, or set
|
|
234
243
|
`AURA_CHROME_PATH` to its executable. For `.webm` motion video, also install
|
|
@@ -275,7 +284,7 @@ Every row carries `page_url` (open it to see the design) and `author` where Aura
|
|
|
275
284
|
- **Big code in one call.** Search rows are slim excerpts by design. Skip the 3-chunk manual concat: `aura_get_component {id, full:true}` and `aura_scaffold_page {goal, full:true}` return complete bodies (33,897-char component verified in one call). Default stays chunked to protect context.
|
|
276
285
|
- **Counts are live upstream.** `aura_status` counts mirror the Aura catalogue right now; `freshness` shows max `updated_at` per surface. Counts only grow when Aura publishes — a freshness bump with flat counts means metadata moved, not new components.
|
|
277
286
|
- **`total` means upstream matches** (for limit/offset paging), not post-filter rows. Local drops are disclosed, never silent: `min_views_filtered_out`, `negative_theme_filtered_out`, `deduped`, bundle `dropped_refs`.
|
|
278
|
-
- **Award errors are labeled, never masked.** `NOT_FOUND` (−32004) = unknown slug; `UPSTREAM_ERROR` (−32000) = blocked/failing source (blocks are never retried); `BROWSER_UNAVAILABLE` = install Chrome; `INDEX_BUSY` = crawl already running (`resume` continues); `INDEX_CORRUPT` = file quarantined + rebuilt empty. Empty award results carry `suggestions` or `emptyCorpus:true`; failures carry `liveError`. Refusal means zero rows matched (best-row gate, theme-first ordering kept). Site `ideas` run 0–6 by evidence (1 on thin evidence is valid) and are always `status:suggested` with an observed `basis`. Blueprint `confidence` is evidence-scored (refs + matched sections + recorded motion + measured structure + fully-parsed tech → low…high, with `confidenceWhy`). Known limits: taxonomy/element depth follows the polite crawl (
|
|
287
|
+
- **Award errors are labeled, never masked.** `NOT_FOUND` (−32004) = unknown slug; `UPSTREAM_ERROR` (−32000) = blocked/failing source (blocks are never retried); `BROWSER_UNAVAILABLE` = install Chrome; `INDEX_BUSY` = crawl already running (`resume` continues); `INDEX_CORRUPT` = file quarantined + rebuilt empty. Empty award results carry `suggestions` or `emptyCorpus:true`; failures carry `liveError`. Award fetches pass a URL policy (http(s) only; private/loopback/link-local/metadata ranges blocked; bounded best-effort DNS check; redirect targets re-checked; bodies size-capped) — `allowLocal` relaxes loopback only. Refusal means zero rows matched (best-row gate, theme-first ordering kept). Site `ideas` run 0–6 by evidence (1 on thin evidence is valid) and are always `status:suggested` with an observed `basis`. Blueprint `confidence` is evidence-scored (refs + matched sections + recorded motion + measured structure + fully-parsed tech → low…high, with `confidenceWhy`). Known limits: taxonomy/element depth follows the polite crawl (`maxPages` is a per-call budget, `resume` continues); palettes come only from observable page evidence; tech labels are inferences with triggers shown; `static-html` bands have no measured offsets.
|
|
279
288
|
|
|
280
289
|
---
|
|
281
290
|
## Prompt for AI agents (start here)
|
|
@@ -356,7 +365,7 @@ Optional tuning (all with defaults):
|
|
|
356
365
|
|
|
357
366
|
|
|
358
367
|
```bash
|
|
359
|
-
npm test # hermetic tests, no network (
|
|
368
|
+
npm test # hermetic tests, no network (275 tests)
|
|
360
369
|
npm run verify # 45 live checks against the real catalogue + award validation
|
|
361
370
|
npm run build # rebundle src/*.mjs into dist/server.js
|
|
362
371
|
```
|
|
@@ -369,7 +378,7 @@ Layout: `src/config.mjs` holds env parsing. `src/http.mjs` hides timeouts and re
|
|
|
369
378
|
|
|
370
379
|
Star it if it saved you a tab or twenty: [github.com/swastiksingh-dev/Aura-Components-MCP](https://github.com/swastiksingh-dev/Aura-Components-MCP). Reposits welcome — see [DIRECTION.md](https://github.com/swastiksingh-dev/Aura-Components-MCP/blob/main/DIRECTION.md) for where this is headed.
|
|
371
380
|
|
|
372
|
-
[](https://star-history.com/#swastiksingh-dev/Aura-Components-MCP&Date)
|
|
381
|
+
[](https://star-history.com/#swastiksingh-dev/Aura-Components-MCP&Date)
|
|
373
382
|
|
|
374
383
|
```text
|
|
375
384
|
built a free design MCP on aura.build: 2495 components, 192 skills, 30k assets, 35 tools. no login. resources are @MengTo's
|
package/SETUP.md
CHANGED
|
@@ -110,8 +110,10 @@ Core award search/index/blueprint needs nothing extra. Live capture, structure,
|
|
|
110
110
|
and motion need Chrome/Chromium (or `AURA_CHROME_PATH` to its executable);
|
|
111
111
|
`.webm` motion video additionally needs ffmpeg (or `AURA_FFMPEG_PATH`).
|
|
112
112
|
Corpus lives in `~/.aura-mcp/awards` (`AURA_AWARDS_DIR` overrides). Build it with
|
|
113
|
-
`aura_award_index {action:rebuild}` (bounded `maxPages`, `resume`
|
|
114
|
-
|
|
113
|
+
`aura_award_index {action:rebuild}` (bounded `maxPages`, 1–20 per call). `resume`
|
|
114
|
+
finishes pending work; re-running `rebuild` continues an unfinished cycle and
|
|
115
|
+
starts a fresh one only after completion; `refresh` forces a new crawl. The
|
|
116
|
+
server never crawls on startup.
|
|
115
117
|
|
|
116
118
|
## Any other MCP client
|
|
117
119
|
|