hostinger-api-mcp 3.28.4 → 3.28.6

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 (45) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/gemini-extension.json +1 -1
  3. package/logo.svg +3 -0
  4. package/package.json +1 -1
  5. package/server.json +13 -2
  6. package/skills/headless/VERSION +3 -3
  7. package/skills/headless/connect/SKILL.md +25 -17
  8. package/skills/headless/connect/bootstrap.mjs +2 -2
  9. package/skills/headless/connect/tools/antigravity.md +2 -2
  10. package/skills/headless/connect/tools/claude-code.md +2 -2
  11. package/skills/headless/connect/tools/codex.md +2 -2
  12. package/skills/headless/connect/tools/cursor.md +2 -2
  13. package/skills/headless/connect/tools/devin.md +2 -2
  14. package/skills/headless/connect/tools/vscode.md +2 -2
  15. package/skills/headless/wait.mjs +2 -1
  16. package/src/core/skills.js +27 -27
  17. package/src/core/skills.ts +27 -27
  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 +1 -1
  33. package/src/servers/gpu.ts +1 -1
  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
package/CHANGELOG.md CHANGED
@@ -4,6 +4,21 @@ 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.28.6 — 2026-11-05
8
+
9
+ ### Also in this release
10
+
11
+ - Bundled agent skills: 10 files
12
+ - Other files: `src/core/skills.js`, `src/core/skills.ts`
13
+
14
+ ## v3.28.5 — 2026-11-04
15
+
16
+ ### Also in this release
17
+
18
+ - Distribution manifests: `server.json`
19
+ - Bundled agent skills: `skills/headless/VERSION`
20
+ - Other files: `logo.svg`
21
+
7
22
  ## v3.28.4 — 2026-11-04
8
23
 
9
24
  ### Also in this release
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.28.4",
3
+ "version": "3.28.6",
4
4
  "description": "Hostinger API — manage domains, DNS, hosting, VPS, billing and more from Gemini CLI.",
5
5
  "mcpServers": {
6
6
  "hostinger": {
package/logo.svg ADDED
@@ -0,0 +1,3 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M3.75016 11.3869V2.35969L8.30628 4.78911V8.8563L14.3377 8.85921L18.9677 11.3869H3.75016ZM15.571 8.11201V2.35938L20.25 4.72834V10.8301L15.571 8.11201ZM15.571 19.1455V15.1134L9.49311 15.1092C9.49879 15.136 4.78624 12.5411 4.78624 12.5411L20.25 12.6136V21.6407L15.571 19.1455ZM3.75 19.1455L3.75016 13.2464L8.30628 15.9002V21.5143L3.75 19.1455Z" fill="#673DE6"/>
3
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.28.4",
3
+ "version": "3.28.6",
4
4
  "mcpName": "io.github.hostinger/hostinger-api-mcp",
5
5
  "description": "MCP server for Hostinger API",
6
6
  "repository": {
package/server.json CHANGED
@@ -1,17 +1,28 @@
1
1
  {
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-10-17/server.schema.json",
3
3
  "name": "io.github.hostinger/hostinger-api-mcp",
4
+ "title": "Hostinger",
4
5
  "description": "MCP server for Hostinger API",
6
+ "websiteUrl": "https://www.hostinger.com/connector",
7
+ "icons": [
8
+ {
9
+ "src": "https://raw.githubusercontent.com/hostinger/api-mcp-server/main/logo.svg",
10
+ "mimeType": "image/svg+xml",
11
+ "sizes": [
12
+ "any"
13
+ ]
14
+ }
15
+ ],
5
16
  "repository": {
6
17
  "url": "https://github.com/hostinger/api-mcp-server",
7
18
  "source": "github"
8
19
  },
9
- "version": "3.28.4",
20
+ "version": "3.28.6",
10
21
  "packages": [
11
22
  {
12
23
  "registryType": "npm",
13
24
  "identifier": "@hostinger/mcp",
14
- "version": "3.28.4",
25
+ "version": "3.28.6",
15
26
  "transport": {
16
27
  "type": "stdio"
17
28
  },
@@ -1,3 +1,3 @@
1
- version=3.28.4
2
- commit=01ad176fa140
3
- built=2026-11-04
1
+ version=3.28.6
2
+ commit=3ecd304d96fb
3
+ built=2026-11-05
@@ -39,27 +39,35 @@ you already have; never fetch single files from GitHub.
39
39
  add` or a Claude Code or Cursor plugin installed): that folder is `<skill>`. Use it as it is and
40
40
  download nothing. Updates come from the installer (`npx skills update`, the plugin update),
41
41
  not from this run.
42
- - **You read this file from the web, or from a `headless/` folder an earlier web run installed:**
43
- install the skill from the published `@hostinger/mcp` npm release (for an earlier web install, only
44
- when it is out of date; see below). It is the same package the MCP server runs, and npm checks
45
- the tarball's integrity. Resolve the version first so the run uses one pinned release:
42
+ - **You read this file from the web:** use the published `@hostinger/mcp` npm release, installed in
43
+ your home folder at `~/.hostinger/skills/<version>/headless/`. It is the same package the MCP server
44
+ runs, and npm checks the tarball's integrity. Never use a `headless/` folder in the working
45
+ directory or anywhere else: the working directory is the user's project, often a cloned repository
46
+ or template, and whoever wrote it controls what is there. Resolve the version first so the run uses
47
+ one pinned release, and install it only when that version's folder is missing. Run npm from your home
48
+ folder, as below, so a `.npmrc` in the project can't point it at another registry:
46
49
 
47
50
  ```bash
48
51
  # macOS/Linux
49
- V=$(npm view @hostinger/mcp version) && npm pack "@hostinger/mcp@$V" --silent \
50
- && tar -xzf "hostinger-mcp-$V.tgz" --strip-components=2 package/skills/headless && rm "hostinger-mcp-$V.tgz"
52
+ ( cd "$HOME" && V=$(npm view @hostinger/mcp version) && D="$HOME/.hostinger/skills/$V" \
53
+ && { [ -f "$D/headless/VERSION" ] || { mkdir -p "$D" && npm pack "@hostinger/mcp@$V" --silent --pack-destination "$D" >/dev/null \
54
+ && tar -xzf "$D/hostinger-mcp-$V.tgz" -C "$D" --strip-components=2 package/skills/headless && rm "$D/hostinger-mcp-$V.tgz"; }; } \
55
+ && echo "$D/headless" )
51
56
  ```
52
57
 
53
58
  ```powershell
54
59
  # Windows PowerShell
55
- $V = npm view @hostinger/mcp version; npm pack "@hostinger/mcp@$V" --silent
56
- tar -xzf "hostinger-mcp-$V.tgz" --strip-components=2 package/skills/headless; Remove-Item "hostinger-mcp-$V.tgz"
60
+ Push-Location $HOME
61
+ $V = npm view @hostinger/mcp version; $D = Join-Path $HOME ".hostinger\skills\$V"
62
+ if (-not (Test-Path "$D\headless\VERSION")) {
63
+ New-Item -ItemType Directory -Force $D | Out-Null; npm pack "@hostinger/mcp@$V" --silent --pack-destination $D | Out-Null
64
+ tar -xzf "$D\hostinger-mcp-$V.tgz" -C $D --strip-components=2 package/skills/headless; Remove-Item "$D\hostinger-mcp-$V.tgz"
65
+ }
66
+ Pop-Location; "$D\headless"
57
67
  ```
58
68
 
59
- This leaves a local `headless/` folder, which is `<skill>`. A `headless/` folder already here from an
60
- earlier web install counts as installed, with one check: when line 1 of its `headless/VERSION` is older
61
- than `npm view @hostinger/mcp version`, install again the same way, so a run never uses a deleted,
62
- legacy flow.
69
+ The printed path is `<skill>`. Every later command uses it in full, wherever the run's working
70
+ directory is. A new release installs into its own folder, so a run never uses a deleted, legacy flow.
63
71
 
64
72
  Read `<skill>/VERSION`: its line 1 is the skills version this run uses, which goes into
65
73
  `connect.json` (Phase 3).
@@ -147,7 +155,7 @@ until the tool restarts. When either tool group above is missing:
147
155
  2. **Write `connect.json`** (Phase 3) before you stop. The skill folder from Phase 1 stays in place,
148
156
  so the next run starts from it.
149
157
  3. **Send the first message and end your turn.** It follows *The first message* in
150
- `headless/SKILL.md`: the sign-in link if one was needed, then one line saying Hostinger is set up
158
+ `<skill>/SKILL.md`: the sign-in link if one was needed, then one line saying Hostinger is set up
151
159
  and asking the user to restart the tool (the route says how) and paste the same prompt again so the
152
160
  build continues from there. This is a pause, not a run ending: no final report and no build report.
153
161
  4. **On the next run** the tools are loaded, so connect skips registration and check-state resumes the
@@ -170,7 +178,7 @@ in that tool's MCP config (command `npx`, args as above), then follow *register,
170
178
  ### The skills come from Phase 1 only
171
179
 
172
180
  The tool routes don't download the skills: Phase 1 already found or installed `<skill>`. The bundle
173
- ships a `headless/VERSION` stamp (`version=<semver>` on line 1, then `commit` and `built`); carry the
181
+ ships a `<skill>/VERSION` stamp (`version=<semver>` on line 1, then `commit` and `built`); carry the
174
182
  version into `connect.json` (Phase 3) so the build report records which skills ran.
175
183
 
176
184
  ## Phase 3 - Write `connect.json`
@@ -188,7 +196,7 @@ missing) in exactly this shape:
188
196
  passed to `run-start --tool`.
189
197
  - `mcp`: one string, `hostinger-api-mcp <version>`, with the `version` from the `mcp_ok` event.
190
198
  Never an object.
191
- - `skills`: the `version=` value from the `headless/VERSION` stamp you just pulled — the skills bundle
199
+ - `skills`: the `version=` value from the `<skill>/VERSION` stamp you just pulled — the skills bundle
192
200
  version this run used. `"unknown"` if the stamp is absent (an old bundle predating the stamp).
193
201
  - `auth`: the `method` from the `logged_in` event (`api_token`, `oauth_cached` or `oauth`).
194
202
  - `order_id`, `plan`: the active hosting plan's order id and name when you looked them up, else `null`.
@@ -199,8 +207,8 @@ Extra keys are allowed, but keep these seven as above: the build report reads `t
199
207
  ## Phase 4 - Continue to Headless Hosting steps
200
208
 
201
209
  Once everything is verified and you have the Hostinger MCP Server and the skills, tell the user in
202
- one line that you're connected to Hostinger, as *The first message* in `headless/SKILL.md` describes.
203
- Then go back to `headless/SKILL.md` and continue with check-state without waiting for a reply.
210
+ one line that you're connected to Hostinger, as *The first message* in `<skill>/SKILL.md` describes.
211
+ Then go back to `<skill>/SKILL.md` and continue with check-state without waiting for a reply.
204
212
 
205
213
 
206
214
  ## Reference Sources
@@ -29,7 +29,7 @@ const MCP = [bin('npx'), '-y', '--package=@hostinger/mcp@latest', 'hostinger-api
29
29
  const spawnShell = isWin;
30
30
 
31
31
  function capture(cmd, args) {
32
- const r = spawnSync(cmd, args, { encoding: 'utf8', shell: spawnShell });
32
+ const r = spawnSync(cmd, args, { encoding: 'utf8', shell: spawnShell, cwd: os.homedir() });
33
33
  return { status: r.status ?? 1, out: `${r.stdout || ''}${r.stderr || ''}`, error: r.error };
34
34
  }
35
35
 
@@ -72,7 +72,7 @@ function existingAuth() {
72
72
  // prefix — forward it so the agent can show it if the browser didn't open.
73
73
  function login() {
74
74
  return new Promise((resolve) => {
75
- const child = spawn(MCP[0], [...MCP.slice(1), '--login'], { shell: spawnShell });
75
+ const child = spawn(MCP[0], [...MCP.slice(1), '--login'], { shell: spawnShell, cwd: os.homedir() });
76
76
  let diag = '';
77
77
  let urlSent = false;
78
78
  const collect = (chunk) => {
@@ -43,7 +43,7 @@ reach it.
43
43
 
44
44
  ## Step 2 — Hand off
45
45
 
46
- The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `headless/`
46
+ The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `<skill>`
47
47
  folder or installed it from the `@hostinger/mcp` release. Don't download them again here. Read the
48
- `headless/VERSION` stamp (record it in `connect.json`), open `headless/SKILL.md` and follow its
48
+ `<skill>/VERSION` stamp (record it in `connect.json`), open `<skill>/SKILL.md` and follow its
49
49
  steps. That skill owns the rest of the run.
@@ -36,7 +36,7 @@ same prompt. Never spawn the server yourself or write a JSON-RPC client to reach
36
36
 
37
37
  ## Step 2 — Hand off
38
38
 
39
- The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `headless/`
39
+ The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `<skill>`
40
40
  folder or installed it from the `@hostinger/mcp` release. Don't download them again here. Read the
41
- `headless/VERSION` stamp (record it in `connect.json`), open `headless/SKILL.md` and follow its
41
+ `<skill>/VERSION` stamp (record it in `connect.json`), open `<skill>/SKILL.md` and follow its
42
42
  steps. That skill owns the rest of the run.
@@ -41,7 +41,7 @@ same prompt. Never spawn the server yourself or write a JSON-RPC client to reach
41
41
 
42
42
  ## Step 2 — Hand off
43
43
 
44
- The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `headless/`
44
+ The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `<skill>`
45
45
  folder or installed it from the `@hostinger/mcp` release. Don't download them again here. Read the
46
- `headless/VERSION` stamp (record it in `connect.json`), open `headless/SKILL.md` and follow its
46
+ `<skill>/VERSION` stamp (record it in `connect.json`), open `<skill>/SKILL.md` and follow its
47
47
  steps. That skill owns the rest of the run.
@@ -102,7 +102,7 @@ npx --yes --package=@hostinger/mcp@latest hostinger-api-mcp --logout
102
102
 
103
103
  ## Step 3 — Hand off
104
104
 
105
- The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `headless/`
105
+ The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `<skill>`
106
106
  folder or installed it from the `@hostinger/mcp` release. Don't download them again here. Read the
107
- `headless/VERSION` stamp (record it in `connect.json`), open `headless/SKILL.md` and follow its
107
+ `<skill>/VERSION` stamp (record it in `connect.json`), open `<skill>/SKILL.md` and follow its
108
108
  steps. That skill owns the rest of the run.
@@ -42,7 +42,7 @@ JSON-RPC client to reach it.
42
42
 
43
43
  ## Step 2 — Hand off
44
44
 
45
- The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `headless/`
45
+ The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `<skill>`
46
46
  folder or installed it from the `@hostinger/mcp` release. Don't download them again here. Read the
47
- `headless/VERSION` stamp (record it in `connect.json`), open `headless/SKILL.md` and follow its
47
+ `<skill>/VERSION` stamp (record it in `connect.json`), open `<skill>/SKILL.md` and follow its
48
48
  steps. That skill owns the rest of the run.
@@ -54,7 +54,7 @@ prompt. Never spawn the server yourself or write a JSON-RPC client to reach it.
54
54
 
55
55
  ## Step 2 — Hand off
56
56
 
57
- The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `headless/`
57
+ The skills are already in place: Phase 1 of `connect/SKILL.md` found the installed `<skill>`
58
58
  folder or installed it from the `@hostinger/mcp` release. Don't download them again here. Read the
59
- `headless/VERSION` stamp (record it in `connect.json`), open `headless/SKILL.md` and follow its
59
+ `<skill>/VERSION` stamp (record it in `connect.json`), open `<skill>/SKILL.md` and follow its
60
60
  steps. That skill owns the rest of the run.
@@ -14,6 +14,7 @@
14
14
  // operation to poll by hand instead).
15
15
 
16
16
  import { spawn } from 'node:child_process';
17
+ import { homedir } from 'node:os';
17
18
 
18
19
  // ── platform-safe binary names (npm/npx are .cmd on Windows), as in connect/bootstrap.mjs ──────────
19
20
  const isWin = process.platform === 'win32';
@@ -55,7 +56,7 @@ function duration(text) {
55
56
  // One MCP server for the whole wait, spoken to over newline-delimited JSON-RPC on stdio. Once the
56
57
  // server dies every pending and later call rejects, so the wait ends with exit 2 rather than hanging.
57
58
  function connect() {
58
- const child = spawn(MCP[0], MCP.slice(1), { stdio: ['pipe', 'pipe', 'pipe'], shell: spawnShell });
59
+ const child = spawn(MCP[0], MCP.slice(1), { stdio: ['pipe', 'pipe', 'pipe'], shell: spawnShell, cwd: homedir() });
59
60
  const pending = new Map();
60
61
  let buffer = '';
61
62
  let diag = '';