hostinger-api-mcp 3.24.3 → 3.25.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 (49) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +24 -98
  3. package/gemini-extension.json +1 -1
  4. package/package.json +1 -1
  5. package/server.json +2 -2
  6. package/skills/connect-domain/SKILL.md +4 -4
  7. package/skills/deploy-to-hosting/SKILL.md +1 -1
  8. package/skills/headless/SKILL.md +3 -3
  9. package/skills/headless/VERSION +2 -2
  10. package/skills/headless/steps/01-check-state/SKILL.md +1 -1
  11. package/skills/headless/steps/03-provision/SKILL.md +8 -8
  12. package/skills/headless/steps/03-provision/ecommerce/SKILL.md +4 -5
  13. package/skills/headless/steps/03-provision/webapp/SKILL.md +6 -7
  14. package/skills/headless/steps/03-provision/wordpress/SKILL.md +8 -9
  15. package/src/core/runtime.js +153 -0
  16. package/src/core/runtime.ts +153 -0
  17. package/src/core/skills.js +24 -24
  18. package/src/core/skills.ts +24 -24
  19. package/src/core/tools/all.js +189 -10
  20. package/src/core/tools/all.ts +189 -10
  21. package/src/core/tools/hosting.js +189 -10
  22. package/src/core/tools/hosting.ts +189 -10
  23. package/src/servers/agency-hosting.js +1 -1
  24. package/src/servers/agency-hosting.ts +1 -1
  25. package/src/servers/agent-readiness.js +1 -1
  26. package/src/servers/agent-readiness.ts +1 -1
  27. package/src/servers/all.js +1 -1
  28. package/src/servers/all.ts +1 -1
  29. package/src/servers/billing.js +1 -1
  30. package/src/servers/billing.ts +1 -1
  31. package/src/servers/dns.js +1 -1
  32. package/src/servers/dns.ts +1 -1
  33. package/src/servers/domains.js +1 -1
  34. package/src/servers/domains.ts +1 -1
  35. package/src/servers/ecommerce.js +1 -1
  36. package/src/servers/ecommerce.ts +1 -1
  37. package/src/servers/horizons.js +1 -1
  38. package/src/servers/horizons.ts +1 -1
  39. package/src/servers/hosting.js +1 -1
  40. package/src/servers/hosting.ts +1 -1
  41. package/src/servers/mail.js +1 -1
  42. package/src/servers/mail.ts +1 -1
  43. package/src/servers/reach.js +1 -1
  44. package/src/servers/reach.ts +1 -1
  45. package/src/servers/vps.js +1 -1
  46. package/src/servers/vps.ts +1 -1
  47. package/src/servers/wordpress.js +1 -1
  48. package/src/servers/wordpress.ts +1 -1
  49. package/types.d.ts +90 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,26 @@ 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.25.0 — 2026-11-03
8
+
9
+ ### Operations
10
+
11
+ - Added `hosting_websites_list-domains` — List website parked (alias) domains and subdomains
12
+ - Added `hosting_websites_add-domain` — Add a parked (alias) domain or subdomain to a website
13
+ - Added `hosting_websites_remove-domain` — Remove a parked (alias) domain or subdomain from a website
14
+ - Added `hosting_websites_create-deprecated` — Create website
15
+ - Hid 8 operations from search (they still run through `execute`): `hosting_websites_start-setup`, `hosting_domains_generate-free-subdomain`, `hosting_domains_list-website-parked`, `hosting_domains_create-website-parked`, `hosting_domains_delete-website-parked`, `hosting_domains_list-website-subdomains`, `hosting_domains_create-website-subdomain`, `hosting_domains_delete-website-subdomain`
16
+ - Changed the title, annotations, description, HTTP method, endpoint path, input schema and auth requirements of `hosting_websites_start-setup`
17
+ - Changed the title, annotations, description, endpoint path and input schema of `hosting_websites_create`
18
+
19
+ ### Also in this release
20
+
21
+ - Documentation: `README.md`
22
+ - Bundled agent skills: 9 files
23
+ - Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
24
+ - Other files: `src/core/skills.js`, `src/core/skills.ts`
25
+ - Build and packaging: `types.d.ts`
26
+
7
27
  ## v3.24.3 — 2026-11-03
8
28
 
9
29
  ### Also in this release
package/README.md CHANGED
@@ -69,7 +69,7 @@ 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 (413 total)
72
+ - `hostinger-api-mcp` — unified server over every operation (408 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
@@ -77,7 +77,7 @@ This package installs the following MCP server commands:
77
77
  - `hostinger-domains-mcp` — 43 operations for domains
78
78
  - `hostinger-ecommerce-mcp` — 30 operations for ecommerce
79
79
  - `hostinger-horizons-mcp` — 7 operations for horizons
80
- - `hostinger-hosting-mcp` — 62 operations for hosting
80
+ - `hostinger-hosting-mcp` — 57 operations for hosting
81
81
  - `hostinger-mail-mcp` — 39 operations for mail
82
82
  - `hostinger-reach-mcp` — 71 operations for reach
83
83
  - `hostinger-vps-mcp` — 68 operations for vps
@@ -1905,6 +1905,27 @@ Clear a website's server cache (the hosting server's page cache) and Hostinger C
1905
1905
  - **Method**: `custom`
1906
1906
  - **Path**: `custom`
1907
1907
 
1908
+ #### hosting_websites_list-domains
1909
+
1910
+ List the extra domains of a website: its parked (alias) domains, which show the same site under another domain name, and its subdomains (e.g. blog.example.com), with each one's root directory. parked items have domain (a domain name or an IP address) and type (domain or ip); subdomains items have domain (the full name), subdomain (the prefix) and root_directory. A list that cannot be read comes back as { error } and the other is still returned. To add or remove one use hosting_websites_add-domain or hosting_websites_remove-domain. Works for Shared and Cloud hosting websites.
1911
+
1912
+ - **Method**: `custom`
1913
+ - **Path**: `custom`
1914
+
1915
+ #### hosting_websites_add-domain
1916
+
1917
+ Add a domain to an existing website: type parked adds a parked (alias) domain, a second domain name (or an IP address) that shows the same site; type subdomain creates a subdomain such as blog.example.com with its own directory. For a parked domain the domain must be owned by the account or already point to the website: check a domain from outside the account with hosting_domains_verify-ownership first. www belongs to the main domain: do not add it as a subdomain. To create a new website use hosting_websites_create instead. Works for Shared and Cloud hosting websites.
1918
+
1919
+ - **Method**: `custom`
1920
+ - **Path**: `custom`
1921
+
1922
+ #### hosting_websites_remove-domain
1923
+
1924
+ Remove a parked (alias) domain or a subdomain from a website. Pass its name as hosting_websites_list-domains shows it: a parked domain, or a subdomain's full name or prefix; the tool finds which one it is. To delete a whole website use hosting_websites_delete. Works for Shared and Cloud hosting websites.
1925
+
1926
+ - **Method**: `custom`
1927
+ - **Path**: `custom`
1928
+
1908
1929
  #### hosting_websites_trigger-event
1909
1930
 
1910
1931
  Tell Hostinger that something happened on this website, so Hostinger services such as hPanel can react to it. `event.name` picks the event and decides which `event.params` it takes. The call changes nothing on the website.
@@ -2072,73 +2093,6 @@ requirements.
2072
2093
  - **Method**: `GET`
2073
2094
  - **Path**: `/api/hosting/v1/datacenters`
2074
2095
 
2075
- #### hosting_domains_generate-free-subdomain
2076
-
2077
- Generate a unique free subdomain that can be used for hosting services without purchasing custom domains.
2078
- Free subdomains allow you to start using hosting services immediately
2079
- and you can always connect a custom domain to your site later.
2080
-
2081
- - **Method**: `POST`
2082
- - **Path**: `/api/hosting/v1/domains/free-subdomains`
2083
-
2084
- #### hosting_domains_list-website-parked
2085
-
2086
- Retrieve all parked or alias domains created under the selected website.
2087
-
2088
- Use this endpoint to inspect parked domain configuration for a specific website,
2089
- including the parent domain and root directory assigned to each parked domain.
2090
-
2091
- - **Method**: `GET`
2092
- - **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains`
2093
-
2094
- #### hosting_domains_create-website-parked
2095
-
2096
- Create a parked or alias domain for the selected website.
2097
-
2098
- Provide a domain name or IP address to park on the website so it serves the same content
2099
- as the parent domain.
2100
-
2101
- - **Method**: `POST`
2102
- - **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains`
2103
-
2104
- #### hosting_domains_delete-website-parked
2105
-
2106
- Delete an existing parked or alias domain from the selected website.
2107
-
2108
- Use this endpoint to remove parked domains that are no longer needed.
2109
-
2110
- - **Method**: `DELETE`
2111
- - **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains/{parkedDomain}`
2112
-
2113
- #### hosting_domains_list-website-subdomains
2114
-
2115
- Retrieve all subdomains created under the selected website.
2116
-
2117
- Use this endpoint to inspect subdomain configuration for a specific website,
2118
- including the parent domain and root directory assigned to each subdomain.
2119
-
2120
- - **Method**: `GET`
2121
- - **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains`
2122
-
2123
- #### hosting_domains_create-website-subdomain
2124
-
2125
- Create a new subdomain for the selected website.
2126
-
2127
- Provide a subdomain prefix and, optionally, a custom directory or the
2128
- website public directory to use as the subdomain root.
2129
-
2130
- - **Method**: `POST`
2131
- - **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains`
2132
-
2133
- #### hosting_domains_delete-website-subdomain
2134
-
2135
- Delete an existing subdomain from the selected website.
2136
-
2137
- Use this endpoint to remove subdomains that are no longer needed.
2138
-
2139
- - **Method**: `DELETE`
2140
- - **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains/{subdomain}`
2141
-
2142
2096
  #### hosting_domains_verify-ownership
2143
2097
 
2144
2098
  Verify ownership of a single domain and return the verification status.
@@ -2383,7 +2337,7 @@ website.
2383
2337
  - **Method**: `GET`
2384
2338
  - **Path**: `/api/hosting/v1/onboardings`
2385
2339
 
2386
- #### hosting_websites_start-setup
2340
+ #### hosting_websites_create
2387
2341
 
2388
2342
  Starts a website setup on a Web or Cloud hosting order and returns the created setup
2389
2343
  right away; the website itself is provisioned asynchronously. Poll the list website
@@ -2570,34 +2524,6 @@ endpoint instead.
2570
2524
  - **Method**: `GET`
2571
2525
  - **Path**: `/api/hosting/v1/websites`
2572
2526
 
2573
- #### hosting_websites_create
2574
-
2575
- Deprecated: use `POST /api/hosting/v1/orders/{order_id}/onboardings` (start website setup)
2576
- instead. It takes the same `domain` and `datacenter_code`, can also install WordPress, and
2577
- returns the created setup.
2578
-
2579
- Create a new website for the authenticated client.
2580
-
2581
- You must choose which hosting order to create this website on. Pass that
2582
- order as `order_id` together with the domain name. List orders to see
2583
- available IDs; the website is provisioned on that order's hosting plan.
2584
-
2585
- Only Web and Cloud hosting orders are accepted. To create a website on an Agency
2586
- Plan order, use `POST /api/agency-hosting/v1/orders/{order_id}/websites/setups`.
2587
-
2588
- When the order has no hosting account yet, a new hosting account is set up first, in the
2589
- datacenter given by `datacenter_code` or the order's default datacenter when it is omitted.
2590
- Subsequent websites will be hosted on the same datacenter automatically.
2591
-
2592
- Website creation is asynchronous and takes up to a few minutes. Poll the list website
2593
- setups endpoint with the `domain` filter every 10 to 15 seconds and wait for `status:
2594
- completed` before uploading files, deploying or creating databases. While the setup is
2595
- `running`, endpoints that operate on the website may respond with `404` or `409`.
2596
- `is_enabled` on the websites list reflects suspension, not readiness.
2597
-
2598
- - **Method**: `POST`
2599
- - **Path**: `/api/hosting/v1/websites`
2600
-
2601
2527
  #### hosting_websites_delete
2602
2528
 
2603
2529
  This endpoint permanently removes a website and all of its data. This action
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.24.3",
3
+ "version": "3.25.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.24.3",
3
+ "version": "3.25.0",
4
4
  "mcpName": "io.github.hostinger/hostinger-api-mcp",
5
5
  "description": "MCP server for Hostinger API",
6
6
  "repository": {
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.24.3",
9
+ "version": "3.25.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@hostinger/mcp",
14
- "version": "3.24.3",
14
+ "version": "3.25.0",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -28,10 +28,10 @@ dig +short MX DOMAIN; dig +short TXT DOMAIN; dig +short CAA DOMAIN
28
28
 
29
29
  Shared and Cloud:
30
30
 
31
- - **New website on the domain.** For a domain outside this account run `hosting_domains_verify-ownership` first. When `is_accessible` is false, give the user the `TXT` record it returns to add next to the existing ones, then verify again (propagation takes up to ~10 minutes). Create with `hosting_websites_create` (`domain` without `www.`, `order_id`), then poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed`.
32
- - **Moving a site off its free subdomain.** Shared and Cloud websites cannot be renamed through the API. Either create a website on the real domain and redeploy the project there (the `deploy-to-hosting` skill) — required for WordPress, which keeps its URL in the database — or, for static sites, park the domain on the existing site with `hosting_domains_create-website-parked`.
33
- - **Alias** (a second domain showing the same site): `hosting_domains_create-website-parked`.
34
- - **Subdomain** (`shop.example.com`): `hosting_domains_create-website-subdomain`. `www` belongs to the main domain — do not create it as a subdomain.
31
+ - **New website on the domain.** For a domain outside this account run `hosting_domains_verify-ownership` first. When `is_accessible` is false, give the user the `TXT` record it returns to add next to the existing ones, then verify again (propagation takes up to ~10 minutes). Create with `hosting_websites_create` (`order_id`, `domain` without `www.`), then poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed`.
32
+ - **Moving a site off its free subdomain.** Shared and Cloud websites cannot be renamed through the API. Either create a website on the real domain and redeploy the project there (the `deploy-to-hosting` skill) — required for WordPress, which keeps its URL in the database — or, for static sites, park the domain on the existing site with `hosting_websites_add-domain` (`type: "parked"`).
33
+ - **Alias** (a second domain showing the same site): `hosting_websites_add-domain` with `type: "parked"`.
34
+ - **Subdomain** (`shop.example.com`): `hosting_websites_add-domain` with `type: "subdomain"`. `www` belongs to the main domain — do not create it as a subdomain.
35
35
 
36
36
  Agency Plan:
37
37
 
@@ -32,7 +32,7 @@ Run it from the project directory: the link is written in the current directory,
32
32
  - `.hostinger/site.json` in the project: reuse its `domain` and `username` (or `website_uid`) — only without asking when you or the user wrote it in an earlier deploy; if `git ls-files .hostinger/site.json` lists it, or the project was cloned or downloaded, name the domain and confirm it with the user first. The CLI's `hostinger up` and `hostinger link` write the same file and keep any fields you add while it names the same website (linking another website starts it afresh); its `type` may be `static`, `nodejs` or `php`.
33
33
  - Otherwise look the domain up with `hosting_websites_list` (Shared and Cloud; substring match — take the exact entry) and `agency-hosting_websites_list-plan` (Agency; keep `details.uid`).
34
34
  - No website yet:
35
- - Shared and Cloud: take a domain (the user's own, or `hosting_domains_generate-free-subdomain`) and an `order_id` from `hosting_orders_list`, then `hosting_websites_create`. `datacenter_code` is needed only for the first website on a new plan (first entry of `hosting_datacenters_list`). Poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed` — uploads and deploys return 404 or 409 before that.
35
+ - Shared and Cloud: take an `order_id` from `hosting_orders_list`, then `hosting_websites_create` with the user's own domain, or without `domain` for a free subdomain (the response carries it). `datacenter_code` is needed only for the first website on a new plan (first entry of `hosting_datacenters_list`). Poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed` — uploads and deploys return 404 or 409 before that.
36
36
  - Agency: `agency-hosting_website-setups_create` with `flavor: "php-fpm"` (plus `type: "node-static"` for built frontends), `settings.php.version` from `agency-hosting_php_list-versions-for-order` and `datacenter_code` from `agency-hosting_datacenters_list`. Poll `agency-hosting_website-setups_status` until `completed`; it returns the `website_uid`.
37
37
  - Node.js apps run on Business and Cloud plans (`hostinger_business_*`, `cloud_*` in `hosting_orders_list`). On other plans, build locally and deploy the output as a static site.
38
38
 
@@ -165,7 +165,7 @@ but an instance existing does **not** mean provision is done or can be skipped.
165
165
  which of these cases applies and records it, then provision takes the matching path:
166
166
 
167
167
  1. **An empty headless shell already exists for the domain (the common onboarding case).** Onboarding
168
- creates the website first — an **empty headless shell** (`hosting_websites_start-setup { type:
168
+ creates the website first — an **empty headless shell** (`hosting_websites_create { type:
169
169
  "headless_empty" }`): `website_type` is `headless`, but **no backend is installed** (no WordPress at
170
170
  `/cms`, no store). This still goes through provision, which **adopts the shell and swaps it to the
171
171
  chosen backend** (the backend is picked in refine first): WordPress is installed into the shell's
@@ -173,14 +173,14 @@ which of these cases applies and records it, then provision takes the matching p
173
173
  Ecommerce storefront host. **Never skip provision for a shell, and never create a second site.** See
174
174
  the provision router's *Onboarding handoff*.
175
175
  2. **No instance exists at all** (the user ran the headless flow without onboarding provisioning
176
- anything). Provision creates a fresh headless instance with `hosting_websites_start-setup` using the
176
+ anything). Provision creates a fresh headless instance with `hosting_websites_create` using the
177
177
  chosen backend's own `type`.
178
178
  3. **User wants a webapp.** Provision is a plain Node.js app host, not headless — `webapp` ignores
179
179
  headless shells entirely and is only reached by experimental actions, never the onboarding flow.
180
180
 
181
181
  Either way the create/install is asynchronous and returns `queued` immediately, then it's polled
182
182
  every ~15 s for a few minutes — **what you poll depends on the path**: a fresh
183
- `hosting_websites_start-setup` is polled with `hosting_websites_list-setups` until `completed`, while a
183
+ `hosting_websites_create` is polled with `hosting_websites_list-setups` until `completed`, while a
184
184
  shell swap (`wordpress_installations_install`) creates no new setup, so it's polled with
185
185
  `wordpress_installations_list` until the `/cms` row is `is_valid`. Don't block on that poll. The
186
186
  single rule that makes the overlap safe:
@@ -1,3 +1,3 @@
1
- version=3.24.3
2
- commit=486008c7b123
1
+ version=3.25.0
2
+ commit=f6e99e0c7be6
3
3
  built=2026-11-03
@@ -130,7 +130,7 @@ Query the Hostinger connector — the local files are never trusted on their own
130
130
  - `status: failed` → provisioning stopped before finishing → route to **provision** to self-heal.
131
131
  - **Is it an empty headless shell from onboarding?** A `headless` site whose setup is `completed` is
132
132
  **not necessarily finished** — onboarding now creates the website *before* the build runs, as an
133
- **empty headless shell** (`hosting_websites_start-setup { type: "headless_empty" }`): `website_type`
133
+ **empty headless shell** (`hosting_websites_create { type: "headless_empty" }`): `website_type`
134
134
  is `headless` but **no backend is installed** (no WordPress at `/cms`, no store). Tell a shell from a
135
135
  real backend the same way provision does: within 24 h the setup `type` is `headless_empty`; otherwise
136
136
  `wordpress_installations_list { username, domain, ownership: "all" }` returns **no** `/cms` row and
@@ -46,7 +46,7 @@ Tell the user the backend and its one-line reason before provisioning.
46
46
  > that brings its own code and data; it never installs WordPress. PocketBase is not available in this
47
47
  > version — refine never proposes it, and there is no `pocketbase/` subfolder; if a brief somehow names
48
48
  > it, stop and tell the user rather than improvising it. A **WordPress + Ecommerce** brief (two separate
49
- > backends — a WordPress site **and** a Hostinger Ecommerce store) has no single combined `start-setup`
49
+ > backends — a WordPress site **and** a Hostinger Ecommerce store) has no single combined `hosting_websites_create`
50
50
  > type yet: stop, tell the user it isn't supported as one site, and offer either to continue with just
51
51
  > WordPress or just Ecommerce (route to that one subfolder), **or**, if they want content and a store on
52
52
  > **one** site, to switch the brief to **WordPress + WooCommerce** — the one-site path, which routes to
@@ -56,22 +56,22 @@ Tell the user the backend and its one-line reason before provisioning.
56
56
 
57
57
  Onboarding can create the website **before** you ever run, then paste the build prompt into this agent.
58
58
  When it does, the domain already has an **empty headless shell**: a website set up with
59
- `hosting_websites_start-setup { type: "headless_empty" }` — `website_type` is `headless`, but **nothing
59
+ `hosting_websites_create { type: "headless_empty" }` — `website_type` is `headless`, but **nothing
60
60
  is installed** (no WordPress at `/cms`, no store). It is the hosting slot only, waiting for a backend.
61
61
 
62
62
  So provision has **two entry shapes**, and each subfolder's *detect* step picks between them:
63
63
 
64
64
  - **An empty headless shell already exists for the domain → adopt it and *swap* it to the chosen
65
- backend. Never call `start-setup` again, never create a second site.** The swap is backend-specific:
65
+ backend. Never call `hosting_websites_create` again, never create a second site.** The swap is backend-specific:
66
66
  - **WordPress** → install WordPress **into the existing shell's `/cms`** with
67
67
  `wordpress_installations_install { type: "headless" }` (it rewrites the root `.htaccess` and marks
68
- the site headless-WordPress). Do **not** use `start-setup { type: "headless_wordpress" }` — that is
68
+ the site headless-WordPress). Do **not** use `hosting_websites_create { type: "headless_wordpress" }` — that is
69
69
  only for creating a fresh site.
70
70
  - **Ecommerce** → the empty headless shell **is** the storefront host already (a `headless_ecommerce`
71
71
  website installs no store engine either). Adopt it as the frontend host and go straight to creating
72
72
  the store + custom sales channel.
73
73
  - **No site exists for the domain at all → create it fresh, exactly as each subfolder defines today**
74
- (`start-setup` with the backend's own `type`).
74
+ (`hosting_websites_create` with the backend's own `type`).
75
75
 
76
76
  > **Webapp is not part of this handoff at all.** `webapp` is **not** reached on the usual onboarding
77
77
  > flow — it is only triggered by experimental actions — so it **ignores headless instances entirely**:
@@ -107,8 +107,8 @@ asynchronous — fire it, record `provision.in_progress`, and join at the barrie
107
107
  > 1. **Exact-match the domain** in `hosting_websites_list` (substring filter — match the exact `domain`).
108
108
  > 2. **A `headless` row already exists → adopt + swap it, never create.** Install the backend into that
109
109
  > same site (WordPress → `wordpress_installations_install { type: "headless" }` into `/cms`; Ecommerce
110
- > → adopt as the storefront host). **Do not call `start-setup` again** — that makes a second site.
111
- > 3. **No row at all → create one fresh** with the backend's own `start-setup` type. Create it for **this
110
+ > → adopt as the storefront host). **Do not call `hosting_websites_create` again** — that makes a second site.
111
+ > 3. **No row at all → create one fresh** with the backend's own `hosting_websites_create` type. Create it for **this
112
112
  > build's domain only** — never provision the backend on a different domain than the frontend (the CMS
113
113
  > is the `/cms` path of the same site, never a separate `cms.<domain>`).
114
114
  > 4. **A row of a different kind** (`website_type` not `headless`) → **stop and tell the user**; never
@@ -117,7 +117,7 @@ asynchronous — fire it, record `provision.in_progress`, and join at the barrie
117
117
  > This is the whole of *Onboarding handoff* above, as one checklist. See it for how to tell an empty
118
118
  > shell from an already-provisioned backend.
119
119
 
120
- Follow the chosen subfolder's `SKILL.md` through **detect + create** (its "start-setup" call). The
120
+ Follow the chosen subfolder's `SKILL.md` through **detect + create** (its `hosting_websites_create` call). The
121
121
  moment the create is accepted and queued, record it in `state.json` and **return** — do not sit on the
122
122
  readiness poll:
123
123
 
@@ -50,11 +50,10 @@ Same lifecycle as `../wordpress/SKILL.md` Steps 1–2, but `type: "headless_ecom
50
50
  1. Detect: `hosting_websites_list` / `hosting_websites_list-setups` (exact-match the domain). `completed`
51
51
  → adopt. `running` → poll. `failed` → stop, point at hPanel. If `website_type` is not `headless`
52
52
  (plain WordPress, Node.js, …), stop and tell the user — don't overwrite another kind of site.
53
- 2. Create (only if **no** site exists): `hosting_websites_start-setup { order_id, type: "headless_ecommerce", domain }`
53
+ 2. Create (only if **no** site exists): `hosting_websites_create { order_id, type: "headless_ecommerce", domain }`
54
54
  — **omit `domain`** for a temporary subdomain: the setup generates one itself and returns it (don't
55
- call a separate subdomain op first — there's no need in this flow; the API would also accept one you
56
- generated via `hosting_domains_generate-free-subdomain`, valid 24 h from the client that made it). The
57
- response carries the generated domain; if it differs from the workspace dir, move
55
+ call a separate subdomain op first — there's no need in this flow). The response carries the
56
+ generated domain; if it differs from the workspace dir, move
58
57
  `~/.hostinger/<old>/` → `<new>/` (if `<new>/` already exists, stop and ask instead of moving
59
58
  into it) and update `brief.md`. Poll `list-setups` to `completed`. `website_type` will be `headless`.
60
59
 
@@ -63,7 +62,7 @@ Same lifecycle as `../wordpress/SKILL.md` Steps 1–2, but `type: "headless_ecom
63
62
  > typically created in onboarding), **adopt it as the storefront host and skip the create.** A
64
63
  > `headless_ecommerce` website installs no store engine either, so an empty headless shell *is* the host
65
64
  > you need — there is no backend to "swap" on the website side. Record its `username`/`order_id` and go
66
- > straight to Step 2 (store + custom sales channel). Never call `start-setup` on a domain that already
65
+ > straight to Step 2 (store + custom sales channel). Never call `hosting_websites_create` on a domain that already
67
66
  > has a site.
68
67
 
69
68
  > Don't expect `/cms` or any API on this domain — it serves the storefront you build (Step 6) and
@@ -15,7 +15,7 @@ frontend step builds into and the deploy step ships to as a Node.js application.
15
15
 
16
16
  All website/database operations below go through the Hostinger connector (`execute`).
17
17
 
18
- > **Fire vs join (background provision).** Steps 1–2 up to `hosting_websites_start-setup` are the
18
+ > **Fire vs join (background provision).** Steps 1–2 up to `hosting_websites_create` are the
19
19
  > **fire** half: once the setup is queued, record `provision.in_progress` and return to do prepare work
20
20
  > (see the router `../SKILL.md`). The readiness **poll** at the end of Step 2, plus Steps 3–5, are the
21
21
  > **join** half — run them when an instance-barrier step needs the backend (or immediately, if the
@@ -29,7 +29,7 @@ All website/database operations below go through the Hostinger connector (`execu
29
29
  2. `hosting_websites_list-setups { "domain": "<domain>" }` — exact-match the row:
30
30
  - `completed` → already provisioned → skip to Step 3 (adopt it).
31
31
  - `running` → skip to Step 2 (poll).
32
- - `failed` → tell the user and point them at hPanel; do **not** call start-setup again on your own.
32
+ - `failed` → tell the user and point them at hPanel; do **not** call `hosting_websites_create` again on your own.
33
33
  3. If the site exists but is a different kind (`website_type` is `headless`, or a WordPress/store site),
34
34
  stop and tell the user — this domain already hosts something else. **Never create a second site.**
35
35
  4. **Only provision a webapp for a `webapp` brief.** A `wordpress` or `ecommerce` brief belongs in those
@@ -46,16 +46,15 @@ All website/database operations below go through the Hostinger connector (`execu
46
46
  2. Start the setup as an **empty website** — **omit `type`** (no WordPress, no store):
47
47
 
48
48
  ```json
49
- { "operation": "hosting_websites_start-setup",
49
+ { "operation": "hosting_websites_create",
50
50
  "params": { "order_id": <order_id>, "domain": "<domain>" } }
51
51
  ```
52
52
 
53
53
  `domain` must be a **customer-owned** domain. For a temporary `*.hostingersite.com` subdomain,
54
54
  **omit `domain`** — the setup generates one itself and returns it in the response. Don't call a
55
- separate subdomain op to make one first: there's no need in this flow. (The API would also accept a
56
- subdomain you generated via `hosting_domains_generate-free-subdomain`, valid for 24 h from the client
57
- that made it — this flow just doesn't use that.) The response then carries the generated domain: if it
58
- differs from the workspace directory name, move `~/.hostinger/<old>/` to `~/.hostinger/<new>/`
55
+ separate subdomain op to make one first: there's no need in this flow. The response then carries the
56
+ generated domain: if it differs from the workspace directory name, move `~/.hostinger/<old>/` to
57
+ `~/.hostinger/<new>/`
59
58
  (if `<new>/` already exists, stop and ask instead of moving into it),
60
59
  update the domain in `brief.md`, and tell the user the new domain.
61
60
  3. Poll `hosting_websites_list-setups { "domain": "<domain>" }` every ~15 s until `completed`
@@ -19,7 +19,7 @@ adapter, site marked `headless`. **Out:** `site.json`.
19
19
 
20
20
  All operations below go through the Hostinger connector (`execute`).
21
21
 
22
- > **Fire vs join (background provision).** Step 1, plus the queuing call — `hosting_websites_start-setup`
22
+ > **Fire vs join (background provision).** Step 1, plus the queuing call — `hosting_websites_create`
23
23
  > for a fresh site (Step 2) **or** `wordpress_installations_install` to swap an empty headless shell
24
24
  > (Step 2b) — are the **fire** half: once the job is queued, record `provision.in_progress` and return
25
25
  > to do prepare work (see the router `../SKILL.md`). The readiness **poll** at the end of Step 2 / 2b,
@@ -38,12 +38,12 @@ All operations below go through the Hostinger connector (`execute`).
38
38
  (see the router's *Onboarding handoff*): check `hosting_websites_list-setups { "domain": "<domain>" }`
39
39
  (exact row) and `wordpress_installations_list { username, domain, ownership: "all" }` (exact row):
40
40
  - Setup `running` → provisioning is underway → skip to Step 2's poll.
41
- - Setup `failed` → tell the user and point them at hPanel; do **not** call start-setup again yourself.
41
+ - Setup `failed` → tell the user and point them at hPanel; do **not** call `hosting_websites_create` again yourself.
42
42
  - A WordPress install with `directory: "cms"` already present (or setup `type: headless_wordpress`)
43
43
  → **already provisioned** → skip to Step 3 (adopt it).
44
44
  - A `headless` site with **no** `/cms` install (an **empty headless shell** — setup
45
45
  `type: headless_empty`, typically from onboarding) → **swap it to WordPress** (Step 2b). Do **not**
46
- call `start-setup` again — the website already exists; you only install WordPress into it.
46
+ call `hosting_websites_create` again — the website already exists; you only install WordPress into it.
47
47
 
48
48
  ## Step 2 — Create a fresh headless WordPress site (only when no site exists)
49
49
 
@@ -52,16 +52,15 @@ All operations below go through the Hostinger connector (`execute`).
52
52
  2. Start the setup:
53
53
 
54
54
  ```json
55
- { "operation": "hosting_websites_start-setup",
55
+ { "operation": "hosting_websites_create",
56
56
  "params": { "order_id": <order_id>, "type": "headless_wordpress", "domain": "<domain>" } }
57
57
  ```
58
58
 
59
59
  `domain` must be a **customer-owned** domain. For a temporary `*.hostingersite.com` subdomain,
60
60
  **omit `domain`** — the setup generates one itself and returns it in the response. Don't call a
61
- separate subdomain op to make one first: there's no need in this flow. (The API would also accept a
62
- subdomain you generated via `hosting_domains_generate-free-subdomain`, valid for 24 h from the client
63
- that made it — this flow just doesn't use that.) The response then carries the generated domain:
64
- if it differs from the workspace directory name, move `~/.hostinger/<old>/` to `~/.hostinger/<new>/`
61
+ separate subdomain op to make one first: there's no need in this flow. The response then carries the
62
+ generated domain: if it differs from the workspace directory name, move `~/.hostinger/<old>/` to
63
+ `~/.hostinger/<new>/`
65
64
  (if `<new>/` already exists, stop and ask instead of moving into it),
66
65
  update the domain in `brief.md`, and tell the user the new domain.
67
66
  Admin credentials are generated by the platform; never ask the user for a password.
@@ -70,7 +69,7 @@ All operations below go through the Hostinger connector (`execute`).
70
69
 
71
70
  ## Step 2b — Swap an empty headless shell to WordPress (only when onboarding already made the shell)
72
71
 
73
- The website already exists as an empty `headless` shell, so there is **no `start-setup`** here — you
72
+ The website already exists as an empty `headless` shell, so there is **no `hosting_websites_create`** here — you
74
73
  install WordPress straight into its `/cms` directory. This is the onboarding handoff path.
75
74
 
76
75
  1. Use the shell's `username` and `order_id` from Step 1's row — no new order pick, no new website.