hostinger-api-mcp 3.27.0 → 3.27.2

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 CHANGED
@@ -4,6 +4,19 @@ 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.2 — 2026-11-03
8
+
9
+ ### Also in this release
10
+
11
+ - Bundled agent skills: `skills/headless/VERSION`
12
+
13
+ ## v3.27.1 — 2026-11-03
14
+
15
+ ### Also in this release
16
+
17
+ - Bundled agent skills: `skills/headless/VERSION`
18
+ - Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
19
+
7
20
  ## v3.27.0 — 2026-11-03
8
21
 
9
22
  ### Operations
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.27.0",
3
+ "version": "3.27.2",
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.27.0",
3
+ "version": "3.27.2",
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.27.0",
9
+ "version": "3.27.2",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@hostinger/mcp",
14
- "version": "3.27.0",
14
+ "version": "3.27.2",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -1,3 +1,3 @@
1
- version=3.27.0
2
- commit=dfa3d353b2a7
1
+ version=3.27.2
2
+ commit=728f90a8ae7c
3
3
  built=2026-11-03
@@ -357,6 +357,8 @@ class MCPServer {
357
357
 
358
358
  // System directories and the roots of the home directories. /var as a whole stays deployable: sites live in /var/www, and macOS keeps its temp dir there.
359
359
  systemDirectories = ['/etc', '/root', '/usr', '/bin', '/sbin', '/boot', '/proc', '/sys', '/dev', '/var/lib', '/var/log', '/var/db', '/var/root', '/private/etc', '/private/var/lib', '/private/var/log', '/private/var/db', '/private/var/root', '/System', '/Library',
360
+ // Container secrets (Docker's /run/secrets, the Kubernetes service-account token under /var/run/secrets) and runtime state.
361
+ '/run', '/var/run', '/private/var/run',
360
362
  // Every user's home directory, whatever the current home is (root's is /root, a container's can be /).
361
363
  '/home', '/Users', ...(process.platform === 'win32' ? [path.join(process.env.SystemDrive || 'C:', 'Users')] : [])];
362
364
 
@@ -397,10 +399,32 @@ class MCPServer {
397
399
  // browser profiles and tokens; .claude-worktrees holds Claude Code's git worktrees.
398
400
  const top = path.relative(fold(home), fold(real)).split(path.sep)[0];
399
401
  const inHomeData = inHome && top !== '.claude-worktrees' && (top.startsWith('.') || top === fold('Library') || top === fold('AppData') || top === 'snap');
402
+ // A profile reached outside the home roots (WSL's /mnt/c/Users/me, a home on a mounted disk): the top-level data
403
+ // of a directory under a Users or home directory, and a profile, or a directory holding profiles (/mnt/c/Users,
404
+ // /mnt/c), that has the data of one; a project's own users/ or home/ deploys.
405
+ const looksLikeProfile = (dir) => ['AppData', 'Library', '.ssh', '.aws', '.gnupg', '.kube'].some((name) => fs.existsSync(path.join(dir, name)));
406
+ const holdsProfiles = (dir) => {
407
+ try {
408
+ return fs.readdirSync(dir, { withFileTypes: true }).some((entry) => entry.isDirectory() && looksLikeProfile(path.join(dir, entry.name)));
409
+ } catch (error) {
410
+ return false;
411
+ }
412
+ };
413
+ const segments = real.split(path.sep);
414
+ const inProfile = !inHome && (holdsProfiles(path.join(real, 'Users')) || segments.some((segment, i) => {
415
+ if (!['users', 'home'].includes(segment.toLowerCase())) {
416
+ return false;
417
+ }
418
+ const top = segments[i + 2];
419
+ if (top === undefined) {
420
+ return i + 1 < segments.length ? looksLikeProfile(real) : holdsProfiles(real);
421
+ }
422
+ return top !== '.claude-worktrees' && (top.startsWith('.') || ['library', 'appdata', 'snap'].includes(top.toLowerCase()));
423
+ }));
400
424
  const inSystem = !inHome && this.systemDirectories.some((dir) => inside(dir, real));
401
425
  // Windows drops trailing dots and spaces from a name: .ssh. is .ssh.
402
426
  const inCredentials = real.split(path.sep).some((segment) => this.credentialDirectories.includes((process.platform === 'win32' ? segment.replace(/[. ]+$/, '') : segment).toLowerCase()));
403
- if (inside(real, home) || otherHome || inHomeData || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
427
+ if (inside(real, home) || otherHome || inHomeData || inProfile || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
404
428
  throw new Error('Refusing to deploy ' + localPath + ': it is, or contains, a home, system or credentials location. Pass the project directory or archive.');
405
429
  }
406
430
  }
@@ -389,6 +389,8 @@ class MCPServer {
389
389
 
390
390
  // System directories and the roots of the home directories. /var as a whole stays deployable: sites live in /var/www, and macOS keeps its temp dir there.
391
391
  private systemDirectories = ['/etc', '/root', '/usr', '/bin', '/sbin', '/boot', '/proc', '/sys', '/dev', '/var/lib', '/var/log', '/var/db', '/var/root', '/private/etc', '/private/var/lib', '/private/var/log', '/private/var/db', '/private/var/root', '/System', '/Library',
392
+ // Container secrets (Docker's /run/secrets, the Kubernetes service-account token under /var/run/secrets) and runtime state.
393
+ '/run', '/var/run', '/private/var/run',
392
394
  // Every user's home directory, whatever the current home is (root's is /root, a container's can be /).
393
395
  '/home', '/Users', ...(process.platform === 'win32' ? [path.join(process.env.SystemDrive || 'C:', 'Users')] : [])];
394
396
 
@@ -429,10 +431,32 @@ class MCPServer {
429
431
  // browser profiles and tokens; .claude-worktrees holds Claude Code's git worktrees.
430
432
  const top = path.relative(fold(home), fold(real)).split(path.sep)[0];
431
433
  const inHomeData = inHome && top !== '.claude-worktrees' && (top.startsWith('.') || top === fold('Library') || top === fold('AppData') || top === 'snap');
434
+ // A profile reached outside the home roots (WSL's /mnt/c/Users/me, a home on a mounted disk): the top-level data
435
+ // of a directory under a Users or home directory, and a profile, or a directory holding profiles (/mnt/c/Users,
436
+ // /mnt/c), that has the data of one; a project's own users/ or home/ deploys.
437
+ const looksLikeProfile = (dir: string): boolean => ['AppData', 'Library', '.ssh', '.aws', '.gnupg', '.kube'].some((name: string) => fs.existsSync(path.join(dir, name)));
438
+ const holdsProfiles = (dir: string): boolean => {
439
+ try {
440
+ return fs.readdirSync(dir, { withFileTypes: true }).some((entry) => entry.isDirectory() && looksLikeProfile(path.join(dir, entry.name)));
441
+ } catch (error) {
442
+ return false;
443
+ }
444
+ };
445
+ const segments = real.split(path.sep);
446
+ const inProfile = !inHome && (holdsProfiles(path.join(real, 'Users')) || segments.some((segment: string, i: number) => {
447
+ if (!['users', 'home'].includes(segment.toLowerCase())) {
448
+ return false;
449
+ }
450
+ const top = segments[i + 2];
451
+ if (top === undefined) {
452
+ return i + 1 < segments.length ? looksLikeProfile(real) : holdsProfiles(real);
453
+ }
454
+ return top !== '.claude-worktrees' && (top.startsWith('.') || ['library', 'appdata', 'snap'].includes(top.toLowerCase()));
455
+ }));
432
456
  const inSystem = !inHome && this.systemDirectories.some((dir: string) => inside(dir, real));
433
457
  // Windows drops trailing dots and spaces from a name: .ssh. is .ssh.
434
458
  const inCredentials = real.split(path.sep).some((segment: string) => this.credentialDirectories.includes((process.platform === 'win32' ? segment.replace(/[. ]+$/, '') : segment).toLowerCase()));
435
- if (inside(real, home) || otherHome || inHomeData || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
459
+ if (inside(real, home) || otherHome || inHomeData || inProfile || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
436
460
  throw new Error('Refusing to deploy ' + localPath + ': it is, or contains, a home, system or credentials location. Pass the project directory or archive.');
437
461
  }
438
462
  }
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agency-hosting.js';
5
5
  import instructions from '../core/instructions.agency-hosting.js';
6
6
 
7
- startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.27.0', tools, instructions });
7
+ startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.27.2', tools, instructions });
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agency-hosting.js';
5
5
  import instructions from '../core/instructions.agency-hosting.js';
6
6
 
7
- startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.27.0', tools, instructions });
7
+ startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.27.2', tools, instructions });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agent-readiness.js';
5
5
 
6
- startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/agent-readiness.js';
5
5
 
6
- startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.27.2', tools });
@@ -5,4 +5,4 @@ import tools from '../core/tools/all.js';
5
5
  import instructions from '../core/instructions.js';
6
6
  import skills from '../core/skills.js';
7
7
 
8
- startServer({ name: 'hostinger-api-mcp', version: '3.27.0', tools, instructions, skills });
8
+ startServer({ name: 'hostinger-api-mcp', version: '3.27.2', tools, instructions, skills });
@@ -5,4 +5,4 @@ import tools from '../core/tools/all.js';
5
5
  import instructions from '../core/instructions.js';
6
6
  import skills from '../core/skills.js';
7
7
 
8
- startServer({ name: 'hostinger-api-mcp', version: '3.27.0', tools, instructions, skills });
8
+ startServer({ name: 'hostinger-api-mcp', version: '3.27.2', tools, instructions, skills });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/billing.js';
5
5
 
6
- startServer({ name: 'hostinger-billing-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-billing-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/billing.js';
5
5
 
6
- startServer({ name: 'hostinger-billing-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-billing-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/dns.js';
5
5
 
6
- startServer({ name: 'hostinger-dns-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-dns-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/dns.js';
5
5
 
6
- startServer({ name: 'hostinger-dns-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-dns-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/domains.js';
5
5
 
6
- startServer({ name: 'hostinger-domains-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-domains-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/domains.js';
5
5
 
6
- startServer({ name: 'hostinger-domains-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-domains-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/ecommerce.js';
5
5
 
6
- startServer({ name: 'hostinger-ecommerce-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-ecommerce-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/ecommerce.js';
5
5
 
6
- startServer({ name: 'hostinger-ecommerce-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-ecommerce-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/gpu.js';
5
5
 
6
- startServer({ name: 'hostinger-gpu-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-gpu-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/gpu.js';
5
5
 
6
- startServer({ name: 'hostinger-gpu-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-gpu-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/horizons.js';
5
5
 
6
- startServer({ name: 'hostinger-horizons-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-horizons-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/horizons.js';
5
5
 
6
- startServer({ name: 'hostinger-horizons-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-horizons-mcp', version: '3.27.2', tools });
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/hosting.js';
5
5
  import instructions from '../core/instructions.js';
6
6
 
7
- startServer({ name: 'hostinger-hosting-mcp', version: '3.27.0', tools, instructions });
7
+ startServer({ name: 'hostinger-hosting-mcp', version: '3.27.2', tools, instructions });
@@ -4,4 +4,4 @@ import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/hosting.js';
5
5
  import instructions from '../core/instructions.js';
6
6
 
7
- startServer({ name: 'hostinger-hosting-mcp', version: '3.27.0', tools, instructions });
7
+ startServer({ name: 'hostinger-hosting-mcp', version: '3.27.2', tools, instructions });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/mail.js';
5
5
 
6
- startServer({ name: 'hostinger-mail-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-mail-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/mail.js';
5
5
 
6
- startServer({ name: 'hostinger-mail-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-mail-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/reach.js';
5
5
 
6
- startServer({ name: 'hostinger-reach-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-reach-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/reach.js';
5
5
 
6
- startServer({ name: 'hostinger-reach-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-reach-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/vps.js';
5
5
 
6
- startServer({ name: 'hostinger-vps-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-vps-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/vps.js';
5
5
 
6
- startServer({ name: 'hostinger-vps-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-vps-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/wordpress.js';
5
5
 
6
- startServer({ name: 'hostinger-wordpress-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-wordpress-mcp', version: '3.27.2', tools });
@@ -3,4 +3,4 @@
3
3
  import { startServer } from '../core/runtime.js';
4
4
  import tools from '../core/tools/wordpress.js';
5
5
 
6
- startServer({ name: 'hostinger-wordpress-mcp', version: '3.27.0', tools });
6
+ startServer({ name: 'hostinger-wordpress-mcp', version: '3.27.2', tools });