hostinger-api-mcp 3.25.1 → 3.27.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 (47) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +56 -1
  3. package/gemini-extension.json +1 -1
  4. package/package.json +2 -1
  5. package/server.json +2 -2
  6. package/skills/headless/VERSION +2 -2
  7. package/skills/headless/steps/05-design/SKILL.md +38 -138
  8. package/skills/headless/steps/06-frontend/SKILL.md +2 -1
  9. package/skills/headless/steps/09-done/SKILL.md +1 -1
  10. package/src/core/runtime.js +1 -1
  11. package/src/core/runtime.ts +1 -1
  12. package/src/core/skills.js +9 -16
  13. package/src/core/skills.ts +9 -16
  14. package/src/core/tools/all.js +167 -0
  15. package/src/core/tools/all.ts +167 -0
  16. package/src/core/tools/gpu.js +221 -0
  17. package/src/core/tools/gpu.ts +239 -0
  18. package/src/servers/agency-hosting.js +1 -1
  19. package/src/servers/agency-hosting.ts +1 -1
  20. package/src/servers/agent-readiness.js +1 -1
  21. package/src/servers/agent-readiness.ts +1 -1
  22. package/src/servers/all.js +1 -1
  23. package/src/servers/all.ts +1 -1
  24. package/src/servers/billing.js +1 -1
  25. package/src/servers/billing.ts +1 -1
  26. package/src/servers/dns.js +1 -1
  27. package/src/servers/dns.ts +1 -1
  28. package/src/servers/domains.js +1 -1
  29. package/src/servers/domains.ts +1 -1
  30. package/src/servers/ecommerce.js +1 -1
  31. package/src/servers/ecommerce.ts +1 -1
  32. package/src/servers/gpu.js +6 -0
  33. package/src/servers/gpu.ts +6 -0
  34. package/src/servers/horizons.js +1 -1
  35. package/src/servers/horizons.ts +1 -1
  36. package/src/servers/hosting.js +1 -1
  37. package/src/servers/hosting.ts +1 -1
  38. package/src/servers/mail.js +1 -1
  39. package/src/servers/mail.ts +1 -1
  40. package/src/servers/reach.js +1 -1
  41. package/src/servers/reach.ts +1 -1
  42. package/src/servers/vps.js +1 -1
  43. package/src/servers/vps.ts +1 -1
  44. package/src/servers/wordpress.js +1 -1
  45. package/src/servers/wordpress.ts +1 -1
  46. package/types.d.ts +70 -0
  47. package/skills/headless/steps/05-design/logo-kit.mjs +0 -430
package/CHANGELOG.md CHANGED
@@ -4,6 +4,30 @@ Generated at release time from the diff between the previous and current
4
4
  build. Tool changes are listed individually; everything else is summarised
5
5
  by area.
6
6
 
7
+ ## v3.27.0 — 2026-11-03
8
+
9
+ ### Operations
10
+
11
+ - Added `gpu_catalog_pool-groups` — Get pool groups
12
+ - Added `gpu_catalog_pool-instance-types` — Get pool instance types
13
+ - Added `gpu_catalog_pool-os-templates` — Get pool OS templates
14
+ - Added `gpu_catalog_pool` — Get pool list
15
+
16
+ ### Also in this release
17
+
18
+ - Documentation: `README.md`
19
+ - Dependencies: `package-lock.json`, `package.json`
20
+ - Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
21
+ - Build and packaging: `types.d.ts`
22
+ - Server entry points: `src/servers/gpu.js`, `src/servers/gpu.ts`
23
+
24
+ ## v3.26.0 — 2026-11-03
25
+
26
+ ### Also in this release
27
+
28
+ - Bundled agent skills: 5 files
29
+ - Other files: `src/core/skills.js`, `src/core/skills.ts`
30
+
7
31
  ## v3.25.1 — 2026-11-03
8
32
 
9
33
  ### Operations
package/README.md CHANGED
@@ -69,13 +69,14 @@ pnpm update -g @hostinger/mcp
69
69
 
70
70
  This package installs the following MCP server commands:
71
71
 
72
- - `hostinger-api-mcp` — unified server over every operation (408 total)
72
+ - `hostinger-api-mcp` — unified server over every operation (412 total)
73
73
  - `hostinger-agency-hosting-mcp` — 43 operations for agency-hosting
74
74
  - `hostinger-agent-readiness-mcp` — 4 operations for agent-readiness
75
75
  - `hostinger-billing-mcp` — 10 operations for billing
76
76
  - `hostinger-dns-mcp` — 9 operations for dns
77
77
  - `hostinger-domains-mcp` — 43 operations for domains
78
78
  - `hostinger-ecommerce-mcp` — 30 operations for ecommerce
79
+ - `hostinger-gpu-mcp` — 5 operations for gpu
79
80
  - `hostinger-horizons-mcp` — 7 operations for horizons
80
81
  - `hostinger-hosting-mcp` — 57 operations for hosting
81
82
  - `hostinger-mail-mcp` — 39 operations for mail
@@ -1740,6 +1741,60 @@ store currency. Returns the created variant.
1740
1741
  - **Method**: `POST`
1741
1742
  - **Path**: `/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants`
1742
1743
 
1744
+ ### `hostinger-gpu-mcp`
1745
+
1746
+ #### changelog_list-entries
1747
+
1748
+ What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
1749
+
1750
+ - **Method**: `custom`
1751
+ - **Path**: `custom`
1752
+
1753
+ #### gpu_catalog_pool-groups
1754
+
1755
+ Retrieve GPU pool groups, ordered by name.
1756
+
1757
+ Each group bundles the pools of one GPU model and lists its currently available pools,
1758
+ whether any of them is available and the lowest hourly price among its instance types.
1759
+ The price is returned even when the group is out of stock.
1760
+
1761
+ Use this endpoint to show which GPU models can be ordered and from what price.
1762
+
1763
+ - **Method**: `GET`
1764
+ - **Path**: `/api/gpu/v1/pools/groups`
1765
+
1766
+ #### gpu_catalog_pool-instance-types
1767
+
1768
+ Retrieve the instance types offered by a specified GPU pool, ordered by CPU core count.
1769
+
1770
+ Each instance type describes its CPU, memory and storage, and its hourly price.
1771
+ Only instance types that can currently be ordered are returned.
1772
+
1773
+ Use this endpoint to choose the `pool_instance_id` for a new GPU instance.
1774
+
1775
+ - **Method**: `GET`
1776
+ - **Path**: `/api/gpu/v1/pools/{poolId}/instances`
1777
+
1778
+ #### gpu_catalog_pool-os-templates
1779
+
1780
+ Retrieve the OS templates that can be installed on a specified GPU pool instance type.
1781
+
1782
+ Use this endpoint to choose the `os_template_id` for a new GPU instance.
1783
+
1784
+ - **Method**: `GET`
1785
+ - **Path**: `/api/gpu/v1/pools/{poolId}/instances/{poolInstanceId}/os-templates`
1786
+
1787
+ #### gpu_catalog_pool
1788
+
1789
+ Retrieve all available GPU pools, ordered by name.
1790
+
1791
+ A pool serves GPU accelerators of one model from a single region.
1792
+
1793
+ Use this endpoint to choose a pool before listing its instance types.
1794
+
1795
+ - **Method**: `GET`
1796
+ - **Path**: `/api/gpu/v1/pools`
1797
+
1743
1798
  ### `hostinger-horizons-mcp`
1744
1799
 
1745
1800
  #### changelog_list-entries
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.25.1",
3
+ "version": "3.27.0",
4
4
  "description": "Hostinger API — manage domains, DNS, hosting, VPS, billing and more from Gemini CLI.",
5
5
  "mcpServers": {
6
6
  "hostinger": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.25.1",
3
+ "version": "3.27.0",
4
4
  "mcpName": "io.github.hostinger/hostinger-api-mcp",
5
5
  "description": "MCP server for Hostinger API",
6
6
  "repository": {
@@ -25,6 +25,7 @@
25
25
  "hostinger-dns-mcp": "./src/servers/dns.js",
26
26
  "hostinger-domains-mcp": "./src/servers/domains.js",
27
27
  "hostinger-ecommerce-mcp": "./src/servers/ecommerce.js",
28
+ "hostinger-gpu-mcp": "./src/servers/gpu.js",
28
29
  "hostinger-horizons-mcp": "./src/servers/horizons.js",
29
30
  "hostinger-hosting-mcp": "./src/servers/hosting.js",
30
31
  "hostinger-mail-mcp": "./src/servers/mail.js",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/hostinger/api-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "3.25.1",
9
+ "version": "3.27.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@hostinger/mcp",
14
- "version": "3.25.1",
14
+ "version": "3.27.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -1,3 +1,3 @@
1
- version=3.25.1
2
- commit=f6e99e0c7be6
1
+ version=3.27.0
2
+ commit=dfa3d353b2a7
3
3
  built=2026-11-03
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: headless-step-design
3
- description: "Step 5 (design) of the Hostinger Headless flow. Derives three distinct design directions from brief.md (plus any reference sites and brand assets), lets the user pick one in a single question, checks the chosen one against the 8-point grid and WCAG 2.2 AA, designs the logo as outlined SVG (wordmark, icon mark, favicon), following any logo wish the owner gave, then writes design.md — tokens, type, logo, components, per-page composition, accessibility and imagery — as the contract the frontend implements (the framework/stack is chosen later by the frontend step). When the brief says to keep an existing look, writes design.md from that look and its own logo instead. Prepare work: runs during the provision wait and never touches the backend."
3
+ description: "Step 5 (design) of the Hostinger Headless flow. Derives three distinct design directions from brief.md (plus any reference sites and brand assets), lets the user pick one in a single question, checks the chosen one against the 8-point grid and WCAG 2.2 AA, draws the logo (the site name as text beside a small SVG icon that is also the favicon), following any logo wish the owner gave, then writes design.md — tokens, type, logo, components, per-page composition, accessibility and imagery — as the contract the frontend implements (the framework/stack is chosen later by the frontend step). When the brief says to keep an existing look, writes design.md from that look and its own logo instead. Prepare work: runs during the provision wait and never touches the backend."
4
4
  ---
5
5
 
6
6
  # headless-step-design
@@ -101,13 +101,9 @@ Read `brief.md`, `state.json`, and `content-model.md` if it exists.
101
101
  shade of the same hue in that role only. Spacing moves to the nearest grid value, and a font
102
102
  without an `@fontsource` package swaps to the closest one that resolves (5.4).
103
103
  4. **Logo.** Reuse the existing logo and favicon unchanged; never redraw or recolour them. With no
104
- existing logo, the header shows the site name as text in the kept display font, and no logo is
105
- designed.
104
+ existing logo, the header shows the site name as text in the kept display font; no icon is drawn.
106
105
  5. **Write `design.md`** (Step 7) from the kept look, then hand off as usual. In **Logo**:
107
106
  - *Files* and *Use* name the files as saved (a `.png` stays a `.png`), or say "No favicon kept".
108
- - *Built from* says "Kept, not rebuilt". *Measured* still gives the width at `--logo-h-sm`
109
- (≤ 192 px; else lower `--logo-h-sm` or show the name as text on small screens), and the header
110
- link has `alt` = the site name and a target of at least 24 px (as in Step 6).
111
107
  - With no logo: *Files* says "None", *Use* says the header link holds the site name as text in
112
108
  `--font-display` and the browser's default favicon stays, and the *Don't* line is dropped.
113
109
 
@@ -118,7 +114,7 @@ Before inventing anything, gather what already constrains the design:
118
114
  | Signal | Where | How it constrains |
119
115
  |---|---|---|
120
116
  | Tone, purpose, audience | `brief.md` → *Tone*, *Purpose*, *Audience* | Sets the mood all three directions must fit |
121
- | Brand assets | `brief.md` → *Assets* | Logo, brand colours and fonts are **fixed** in every direction. Never recolour a supplied logo; Step 6 uses it instead of designing one |
117
+ | Brand assets | `brief.md` → *Assets* | Logo, brand colours and fonts are **fixed** in every direction. Never recolour a supplied logo; Step 6 uses it instead of drawing an icon |
122
118
  | Pages and entities | `content-model.md` → *Navigation*, *Pages*, *Articles*; if it doesn't exist yet, `brief.md` → *Pages* | Drives the component inventory and page composition |
123
119
  | Reference sites | URLs in the brief or the conversation | Cues to borrow (see below) |
124
120
  | Images already sourced | `content-model.md` → the image lines under *Articles* (skip if none yet) | Glance at a few at small size; keep accents from clashing with their dominant colours |
@@ -165,9 +161,9 @@ Each direction carries exactly this:
165
161
  outlines, hard 8 px offset shadows, tilted cards").
166
162
  - **Signature element** — the one memorable move (a scrolling marquee, stickers, oversized numerals,
167
163
  a duotone photo treatment). If it moves on its own, it gets a pause control (5.3).
168
- - **Logo idea** — one line on how the name becomes a logo, using a move from Step 6 ("letters
169
- bounce in different colours and the O is a smiley"). When the brief carries a logo wish (*Design
170
- direction* or *Assets*), every direction's logo idea is that wish in its own style. A wish is words
164
+ - **Logo idea** — one line on the small icon beside the name ("a smiling sun in butter yellow with
165
+ an ink outline"). When the brief carries a logo wish (*Design direction* or *Assets*), every
166
+ direction's logo idea is that wish in its own style. A wish is words
171
167
  describing a logo; a logo file in *Assets* is a supplied logo and wins (Step 6).
172
168
 
173
169
  **Only offer what can pass.** Before asking, run two quick gates on **all three**:
@@ -175,8 +171,7 @@ Each direction carries exactly this:
175
171
  1. **Contrast gate.** Every colour that will carry text (base, surfaces, and any accent used as a
176
172
  text block) has a palette text colour reaching **4.5:1** on it. Two text colours are fine (dark on
177
173
  light blocks, light on dark ones). Accents that only ever hold large text need 3:1.
178
- 2. **Font gate.** Each font resolves on npm, and the display font also has a static `@fontsource`
179
- package, because the logo is built from it (5.4).
174
+ 2. **Font gate.** Each font resolves on npm (5.4).
180
175
 
181
176
  A direction that fails either gate gets adjusted, not offered as-is. Don't offer a look that only
182
177
  works by breaking the rules, such as body text on a neon accent or a marquee that can't be stopped.
@@ -199,7 +194,7 @@ notes. The question may end with one plain clause saying they can add a logo ide
199
194
  never suggest one or give an example: that idea would end up in the logo.
200
195
 
201
196
  > **Sticker-book maximal** — Loud and playful, like a scrapbook: candy pink, butter yellow and lilac,
202
- > chunky headlines, tilted sticker photos and a bouncy logo with a smiley O.
197
+ > chunky headlines, tilted sticker photos and a smiling-sun logo.
203
198
 
204
199
  > **Midnight disco** — A dark, glowing night-out feel: deep purple with neon pink, yellow and
205
200
  > turquoise, heavy rounded headlines and a logo like a neon sign.
@@ -217,8 +212,8 @@ Then:
217
212
  **Logo wish.** An answer can carry a logo idea next to the pick ("A, and make the logo a little
218
213
  teapot"); it replaces the chosen direction's logo idea, and wins over a wish from the brief.
219
214
  Whenever the logo follows a wish, from the answer or the brief, add it once to the line that confirms
220
- the pick: *"The logo follows your idea: a little teapot."* If the kit can't draw it as said (a
221
- detailed illustration, a photo), build its closest kit version and name what you simplified in that
215
+ the pick: *"The logo follows your idea: a little teapot."* If it can't be a small icon as said (a
216
+ detailed illustration, a photo), draw a simple version of it and name what you simplified in that
222
217
  same line. Don't ask a follow-up.
223
218
 
224
219
  Don't ask about anything else in this step.
@@ -297,9 +292,7 @@ These criteria are settled at design time. Write each answer into the **Accessib
297
292
  For each family, prefer the variable package and fall back to the static one:
298
293
  `npm view @fontsource-variable/<slug> version`, then `npm view @fontsource/<slug> version`. One must
299
294
  answer with a version. If neither does, swap to the closest family that does. Record the exact
300
- package names. The **display** family must also resolve as a static package
301
- (`npm view @fontsource/<slug> version`): the static packages ship `.woff` files the logo kit can
302
- read; the variable ones ship only `.woff2`.
295
+ package names.
303
296
 
304
297
  ### 5.5 The header fits on one line
305
298
 
@@ -314,7 +307,10 @@ can't build it that way.
314
307
  button at the width where the logo, all nav items and the button stop fitting on one line, which is
315
308
  usually wider than the mobile breakpoint. Estimate that width from the number of nav items and their
316
309
  label lengths, round up to a multiple of 8, and make it the header's own breakpoint. Below it, only
317
- the logo and the menu button show; the nav items and the CTA move into the opened menu.
310
+ the logo and the menu button show; the nav items and the CTA move into the opened menu. At 320 px
311
+ the icon, the site name (`--text-logo`, `white-space: nowrap`) and the menu button still fit one
312
+ row; lower `--text-logo` for a long name until they do. A supplied or kept logo and the menu
313
+ button must fit too; lower `--logo-h` (still ≥ 24 px) until they do.
318
314
  - **Keep header labels short.** A nav label is one or two short words; a button label is a two-word
319
315
  verb phrase at most ("Book now", not "Book an Appointment"). When the content model gives a long
320
316
  navigation label, the header may show a shorter form ("Contact & Booking" → "Contact") while the
@@ -322,114 +318,18 @@ can't build it that way.
322
318
  - Record the header breakpoint in *Grid, shape & motion* and the `nowrap` + collapse rule in the
323
319
  **Header + nav** component row (and its `≤ 320 px` cell).
324
320
 
325
- ## Step 6 — Design the logo
321
+ ## Step 6 — Draw the logo
326
322
 
327
323
  **The user supplied a logo** → copy it into `brand/` unchanged, note it in the **Logo** section, and
328
324
  skip the rest of this step. Never redraw or recolour it.
329
325
 
330
- Otherwise, turn the brief's **Site name**, spelled as the user confirmed it, into a **designed** logo:
331
- shaped, coloured and composed. Typing the name in the display font with an emoji or symbol next to it
332
- doesn't count. Build the chosen direction's **logo idea** (as replaced by any logo wish, Step 4) with
333
- one or two of these moves:
326
+ Otherwise the logo is the brief's **Site name**, spelled as the user confirmed it, as text in the
327
+ display font, beside one small icon. Write the icon by hand as `brand/logo-mark.svg`: the chosen
328
+ direction's **logo idea** (or the owner's logo wish, Step 4) in palette colours, simple enough to
329
+ read at 16 px on light and dark tab bars, because it is also the favicon. Give it a `viewBox` and
330
+ no text inside: the name beside it is the text. No emoji or raster clip-art.
334
331
 
335
- | Move | What it is | Suits |
336
- |---|---|---|
337
- | **Letter swap** | One letter becomes a simple shape tied to the subject: O → smiley, sun, loaf, plate, eye; I → candle, pencil, brush; A → roof, tent. Swap **one character** only, even if the letter appears twice, and the word must still read | Playful, friendly brands |
338
- | **Bounce** | Letters tilt ±3–6° and bob off the baseline, each in a palette colour, with an ink outline and hard shadow | Loud, maximal directions |
339
- | **Stack** | The name split over 2–3 lines on coloured tiles, or set as a tight block | Long names, bold directions |
340
- | **Tag** | The main word large; a short second word on a pill, ribbon or tab | Two-part names ("Dopamine Den") |
341
- | **Seal** | The name around a ring, with a monogram or symbol in the middle | A secondary mark (footer, hero sticker, social avatar), never the header logo |
342
- | **Typographic contrast** | Weight, style or case contrast between words (a light italic word next to a heavy upright one), custom tight spacing, one shared stroke or cut between letters | Quiet, refined, editorial directions |
343
-
344
- No emoji, clip-art, gradients, or details that vanish at small sizes. Colours come only from the
345
- palette (base and surface colours count).
346
-
347
- ### Build it with the logo kit
348
-
349
- The kit (`logo-kit.mjs`, next to this file) does the error-prone parts: it outlines letters into
350
- vector paths, sets text on a circle, draws the outline-and-shadow treatment, measures, validates
351
- the output, checks the sizes and renders a preview. You write the composition. Copy the kit into
352
- `brand/` so the build is self-contained and a redesign can re-run it:
353
-
354
- ```bash
355
- mkdir -p ~/.hostinger/<domain>/brand && cd ~/.hostinger/<domain>/brand
356
- cp <the folder this SKILL.md is in>/logo-kit.mjs .
357
- npm init -y >/dev/null && npm i opentype.js @resvg/resvg-js @fontsource/<display-slug>
358
- ```
359
-
360
- Write `brand/logo-build.mjs`, import from `./logo-kit.mjs`, and always run it from `brand/`
361
- (packages resolve from the working directory):
362
-
363
- | Kit function | Use |
364
- |---|---|
365
- | `loadFont(slug, weight, style)` | Loads a static `@fontsource` weight across all its subsets (`latin`, `latin-ext`, …), so accented letters like Ė or Ł resolve; `style` is `'normal'` or `'italic'`. Throws if that weight or style isn't in the package, so pick another |
366
- | `layout(font, text, size)` | Kerned glyph positions, total width, `capHeight`, `xHeight`; place letters one by one for bounce or swap. Throws if a character isn't in the font |
367
- | `glyphPath(glyph, x, baselineY, size)` / `textPath(font, text, x, baselineY, size)` | Outlined path data for one letter or a whole word. For typographic contrast, load two weights or styles and set each word with `textPath` |
368
- | `pathBox(font, text, x, baselineY, size)` | Tight box around a word's outlines; size the viewBox from it plus room for outlines, shadows and tilt |
369
- | `arcText(font, text, { cx, cy, r, size })` | Letters around a circle, for seals |
370
- | `sticker(d, { fill, ink, strokeWidth, shadow, shadowColor, transform })` | Ink outline + hard offset shadow, for outlined directions. On dark backgrounds give the outline and shadow a palette colour that shows (`shadowColor` defaults to `ink`) |
371
- | `svgDoc({ width, height, title, body })` | Root SVG with `role="img"` and a `<title>` |
372
- | `check(svg)` | Throws on `NaN`, live `<text>`, a missing title or viewBox, or an `&` that isn't an XML entity. Run it on every file before writing |
373
- | `tile(size, fill)` | The rounded tile for the mark and favicon; draw the symbol after it |
374
- | `widthBudget(letterHeight, height)` | The widest viewBox that still fits 192 px on small screens, for a logo of that height; see below |
375
- | `checkLogo({ logo, mark, favicon, letterHeight, background })` | Runs `check()` on all three files, checks their sizes and renders `brand/logo-preview.png`; see below |
376
-
377
- Wrap every file in `svgDoc()`, never a hand-written `<svg>` or `<title>`: it escapes the site name,
378
- and one bare `&` (as in "Salt & Pepper") makes the browser show nothing.
379
-
380
- Never call opentype's `path.toPathData()` directly; the kit's serializer exists because opentype.js
381
- 2.0 writes `NaN` into some paths, and browsers silently stop drawing at the first `NaN`.
382
-
383
- ### Deliver four files
384
-
385
- | File | What | Must read clearly at |
386
- |---|---|---|
387
- | `brand/logo.svg` | The primary, mostly horizontal logo for the header | Its header display heights (desktop and small screens) |
388
- | `brand/logo-mark.svg` | A square icon from the same idea (initial, monogram or the swapped symbol) on a `tile()` in a palette colour | 32 px |
389
- | `brand/favicon.svg` | The simplest form of the mark: same tile, no shadow, no thin details, outlines thickened if it has any | 16 px, on both light and dark browser tab bars |
390
- | `brand/logo-build.mjs` | The script that built them, with `package.json`, kept so a redesign can adjust it | — |
391
-
392
- Add `brand/logo-seal.svg` only if the direction uses a seal as a secondary mark. Delete
393
- `brand/node_modules` when you're done; a redesign runs `npm i` in `brand/` first.
394
-
395
- **Compose within the budget, so the first build passes.** The small-screen logo is at most 192 px
396
- wide with letters at least 16 px tall, so the whole logo can be only about 10–12 times as wide as
397
- its smallest letters are tall, whatever its height. On one line that's about ten letters plus a
398
- symbol; a longer name stacks or tags, and a second word set at half size halves the room. Size the
399
- viewBox in `logo-build.mjs` against `widthBudget(letterHeight, viewBoxHeight)`, the exact limit at
400
- the heights the kit picks; with your own `heights`, the FAIL line gives the limit. Draw the mark's
401
- symbol from simple, recognisable shapes that still read at 32 px; fine natural forms like petals or
402
- leaves turn to mush.
403
-
404
- **Check the sizes and look at it after every build.** `letterHeight` is in viewBox units: the
405
- `xHeight` from `layout()` when the logo is mostly lowercase, `capHeight` when it's mostly capitals;
406
- for mixed fonts, the smaller word's. End `logo-build.mjs` with:
407
-
408
- ```js
409
- checkLogo({ logo, mark, favicon, letterHeight, background: '<page background colour>' });
410
- ```
411
-
412
- It picks the header heights for you: `--logo-h-sm` is the smallest multiple of 8 that makes the
413
- letters 16 px, and `--logo-h` the same but at least 48 px, both at most 80 px, so a stacked lockup
414
- keeps its words large or sets the mark beside them. Pass `heights: { desktop, small }` only when the
415
- direction needs a larger header logo. It first prints `--logo-h`, `--logo-h-sm` and the **Measured**
416
- line for `design.md`, then PASS or FAIL for the logo's letters ≥ 16 px at both
417
- heights, width ≤ 192 px on small screens, headroom around everything drawn and heights in multiples
418
- of 8; for the mark and favicon sitting on a `tile()` with nothing clipped and room around
419
- the symbol; and for no shadow on the favicon. Every FAIL names its fixes and the number to reach. It
420
- then renders `logo-preview.png` (the logo at both heights on the page background, the mark at 32 px
421
- and favicon at 16 px on light and dark strips, each also enlarged), and throws if anything failed.
422
-
423
- Then read `logo-preview.png`; don't search for another renderer or read the SVG source. Rebuild only
424
- for a FAIL line or something in the preview that reads wrong, such as collisions, a clipped or
425
- clearly off-centre mark, or a favicon detail that turns to mush, and fix everything you saw in one
426
- rebuild. Optical nudges of a few pixels and the header height aren't reasons to rebuild. A symbol
427
- gets one redraw: if it still reads wrong, replace it with a simpler form of the idea, such as the
428
- initial, in the next build. If the kit says "preview not rendered", rely on the size check and list
429
- "logo not visually checked" under gaps in the final report.
430
-
431
- The logo is exempt from text-contrast minimums, but the header link around it needs `alt` = the site
432
- name and a target of at least 24 px.
332
+ Keep it quick: a few minutes, no installs, build scripts or preview loops.
433
333
 
434
334
  Don't show the logo to the user in this step; they see it in the preview.
435
335
 
@@ -498,8 +398,8 @@ confirms the framework (default Next.js SSR; ecommerce must be SSR) and records
498
398
  /* layout */
499
399
  --content-max: …px; /* multiple of 8 */
500
400
  --header-h: …px; /* header band height, multiple of 8; scroll-padding-top uses it if sticky */
501
- --logo-h: …px; /* header logo height on desktop, multiple of 8 */
502
- --logo-h-sm: …px; /* on small screens; logo ≤ 192 px wide at this height */
401
+ --logo-h: …px; /* header icon (or supplied logo) height, multiple of 8, ≥ 24 */
402
+ --text-logo: …rem; /* site name beside the icon; icon + name + menu button fit at 320 px */
503
403
  }
504
404
  ```
505
405
 
@@ -516,17 +416,17 @@ confirms the framework (default Next.js SSR; ecommerce must be SSR) and records
516
416
  - **Body:** <family> (`@fontsource-variable/<slug>@<version>`); `--text-body` / `--leading-body`, measure ≤ 68ch
517
417
 
518
418
  ## Logo
519
- - **Concept:** <the move(s), and what any swapped letter or symbol stands for, plus "From the owner:
520
- '<their words>'" only when it follows their wish | "Supplied by the user" | "Kept from <source>" |
521
- "No logo: owner kept the current look" (header shows the site name as text in `--font-display`)>
522
- - **Built from:** `@fontsource/<display-slug>@<version>`, weight(s)/style(s) …
523
- - **Files:** `brand/logo.svg` (header, `--logo-h` desktop / `--logo-h-sm` small screens),
524
- `brand/logo-mark.svg`, `brand/favicon.svg`<, `brand/logo-seal.svg`>; source `brand/logo-build.mjs`
525
- - **Measured:** letters … px tall at `--logo-h-sm`; width … px at `--logo-h-sm`
526
- - **Use:** the frontend copies `brand/*.svg` into `public/`. Header: `<a href="/"><img src="/logo.svg"
527
- alt="<Site name>" style="height: var(--logo-h)"></a>` (switch to `--logo-h-sm` on small screens).
528
- Favicon: `<link rel="icon" href="/favicon.svg" type="image/svg+xml">`
529
- - **Don't:** recolour, stretch, add effects, or retype the logo as live text.
419
+ - **Concept:** <what the icon shows, plus "From the owner: '<their words>'" only when it follows
420
+ their wish | "Supplied by the user" | "Kept from <source>" | "No logo: owner kept the current look"
421
+ (header shows the site name as text in `--font-display`)>
422
+ - **Files:** `brand/logo-mark.svg` (header icon at `--logo-h`, and the favicon)
423
+ - **Use:** the frontend copies `brand/` into `public/`. Header: `<a href="/"><img src="/logo-mark.svg"
424
+ alt="" style="height: var(--logo-h)"><Site name></a>`, the name as text in `--font-display`, so
425
+ the link's accessible name is the site name. Favicon: `<link rel="icon" href="/logo-mark.svg"
426
+ type="image/svg+xml">`. A supplied or kept logo goes in the link alone, as
427
+ `<img src="/<file>" alt="<Site name>" style="height: var(--logo-h)">`, with its own favicon if one
428
+ was supplied or kept, else the browser default.
429
+ - **Don't:** recolour or stretch the icon, or replace the name text with an image of it.
530
430
 
531
431
  ## Grid, shape & motion
532
432
  <section padding desktop/mobile (space tokens), gutters, breakpoints in px (multiples of 8), borders,
@@ -575,9 +475,9 @@ duotone…); alt text written from what the photo shows.>
575
475
  nowrap`); the inline nav collapses to a menu button at the width it stops fitting, not only at the
576
476
  mobile breakpoint (5.5).
577
477
  - **Brand assets are fixed.** A supplied logo, colour or font appears in every direction, unchanged.
578
- - **A logo is designed, not typed.** Outlined SVG paths built with the logo kit, never live text,
579
- emoji or clip-art, and always readable at its smallest use. The one exception: a kept look with no
580
- logo shows the site name as text and gets no new logo.
478
+ - **The logo is the name plus a simple icon.** The site name as text in the display font beside a
479
+ small hand-written SVG icon that is also the favicon, or a supplied or kept logo unchanged. No
480
+ emoji or raster clip-art. A kept look with no logo shows the name as text and gets no icon.
581
481
  - **Self-hosted fonts only** (`@fontsource`). No Google Fonts or other font CDN links in the output.
582
482
  - **The tokens block is the only source of values** (breakpoints excepted). Components and pages
583
483
  reference tokens, never raw hex codes, pixel values or font names.
@@ -83,7 +83,8 @@ accessibility — plus the logo files in `brand/`. Don't re-run design questions
83
83
 
84
84
  - Treat `design.md` as the contract: the built pages should match its tokens, type scale, components and
85
85
  per-page composition, and the 8-point grid / WCAG 2.2 AA rules it carries.
86
- - Use the **logo** from `brand/` as-is (wordmark, icon mark, favicon); never recolour or redraw it.
86
+ - Build the **logo** and favicon exactly as `design.md` → **Logo** → *Use* says; never recolour or redraw
87
+ what is in `brand/`.
87
88
  - If `design.md` is **missing** (e.g. a resumed older build), fall back to `brief.md → Design direction`
88
89
  (reference site, colours, brand, adjectives) and a tasteful, accessible default — but prefer `design.md`
89
90
  whenever it exists.
@@ -35,7 +35,7 @@ Write it in this order:
35
35
  | 2 refine | Personal travel blog about coastal towns in the UK; backend: WordPress. |
36
36
  | 3 provision | Business plan, order 41875230; setup took 6 min; domain, SSL and WordPress checks passed. |
37
37
  | 4 content model | 5 pages, 8 posts, 6 categories, 1 menu, 14 images (Hostinger AI), SEO titles on every page; counts re-read from the REST API. |
38
- | 5 design | "Salt & Ink" direction: serif headings, sea-blue accents; `design.md` and logo written, logo check passed. |
38
+ | 5 design | "Salt & Ink" direction: serif headings, sea-blue accents; `design.md` and logo icon written. |
39
39
  | 6 frontend | Next.js SSR with home, blog, post, category and contact pages wired to the REST API; local build passed. |
40
40
  | 7 validate | Instance setup completed; REST API returned the 8 pushed posts; no preview (nobody signing off). |
41
41
  | 8 deploy | Source uploaded, build finished in 3 min; site root returns 200. |
@@ -62,7 +62,7 @@ const GetSkillRequestSchema = z.object({
62
62
 
63
63
  /**
64
64
  * MCP Server for Hostinger API
65
- * Generated from OpenAPI spec version 2.6.2
65
+ * Generated from OpenAPI spec version 2.7.0
66
66
  */
67
67
  class MCPServer {
68
68
  constructor({ name, version, tools, instructions, skills = [] }) {
@@ -94,7 +94,7 @@ interface Skill { uri: string; frontmatter: Record<string, unknown>; resources:
94
94
 
95
95
  /**
96
96
  * MCP Server for Hostinger API
97
- * Generated from OpenAPI spec version 2.6.2
97
+ * Generated from OpenAPI spec version 2.7.0
98
98
  */
99
99
  class MCPServer {
100
100
  private readonly name: string;