hostinger-api-mcp 3.22.1 → 3.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,22 @@ 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.22.3 — 2026-10-29
8
+
9
+ No changes to the published artifact.
10
+
11
+ ## v3.22.2 — 2026-10-29
12
+
13
+ ### Operations
14
+
15
+ - Changed the description of `hosting_headless_submit-build-report`
16
+
17
+ ### Also in this release
18
+
19
+ - Documentation: `README.md`
20
+ - Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
21
+ - Build and packaging: `types.d.ts`
22
+
7
23
  ## v3.22.1 — 2026-10-29
8
24
 
9
25
  ### Also in this release
package/README.md CHANGED
@@ -2234,7 +2234,7 @@ key to a private repository as a deploy key before deploying it.
2234
2234
 
2235
2235
  Submits the build report the headless skill writes at the end of a run (including early
2236
2236
  stops), so Hostinger can learn where builds get stuck. Send one report per call, with the
2237
- report JSON as the request body, unchanged. Only send a report when the user agreed to it.
2237
+ report JSON as the request body, unchanged.
2238
2238
 
2239
2239
  The report must match report.schema.json v1; an invalid report returns 422 and is not
2240
2240
  stored. The report is linked to the authenticated account, so do not add account details
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.22.1",
3
+ "version": "3.22.3",
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.22.1",
3
+ "version": "3.22.3",
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.22.1",
9
+ "version": "3.22.3",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@hostinger/mcp",
14
- "version": "3.22.1",
14
+ "version": "3.22.3",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -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.0
65
+ * Generated from OpenAPI spec version 2.6.1
66
66
  */
67
67
  class MCPServer {
68
68
  constructor({ name, version, tools, instructions, skills = [] }) {
@@ -347,30 +347,36 @@ class MCPServer {
347
347
  // Directories that hold credentials, the server's own token store (hostinger-mcp) among them.
348
348
  credentialDirectories = ['.ssh', '.aws', '.gnupg', '.config', '.kube', '.docker', '.azure', 'hostinger-mcp'];
349
349
 
350
- // System directories. /var as a whole stays deployable: sites live in /var/www, and macOS keeps its temp dir there.
351
- 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'];
350
+ // 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.
351
+ 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',
352
+ // Every user's home directory, whatever the current home is (root's is /root, a container's can be /).
353
+ '/home', '/Users', ...(process.platform === 'win32' ? [path.join(process.env.SystemDrive || 'C:', 'Users')] : [])];
352
354
 
353
355
  // A deploy publishes what it reads, and the path comes from the model, so prompt-injected arguments could
354
356
  // publish any readable file. Refused, before anything is read or sent: the home directory and every directory
355
357
  // above it (they contain the credentials), other users' home directories, system directories, a path in a
356
- // credential directory, and a secret file. Symlinks are resolved first.
358
+ // credential directory, and a secret file. The native realpath resolves symlinks and, on macOS
359
+ // and Windows, the on-disk case, 8.3 short names and trailing dots; a path it cannot resolve is refused.
357
360
  // os is imported by deploy.template: the JS generator dedupes import blocks by their whole text, and this block
358
361
  // must stay identical to agency-hosting/shared's, or tus and fs are imported twice.
359
362
  assertDeployablePath(localPath) {
360
363
  let real;
361
364
  try {
362
- real = fs.realpathSync(localPath);
365
+ real = fs.realpathSync.native(localPath);
363
366
  } catch (error) {
364
367
  throw new Error('Path not found: ' + localPath);
365
368
  }
366
369
  let home = os.homedir();
367
370
  try {
368
- home = fs.realpathSync(home);
371
+ home = fs.realpathSync.native(home);
369
372
  } catch (error) {
370
373
  // a missing home directory has nothing in it to protect
371
374
  }
375
+ // macOS and Windows file systems ignore case: /USERS/me is the home directory there.
376
+ const caseless = process.platform === 'darwin' || process.platform === 'win32';
377
+ const fold = (p) => (caseless ? p.toLowerCase() : p);
372
378
  const inside = (dir, file) => {
373
- const relative = path.relative(dir, file);
379
+ const relative = path.relative(fold(dir), fold(file));
374
380
  return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
375
381
  };
376
382
  // A home in the filesystem root (HOME=/ in a container run as a user without a passwd entry) exempts nothing.
@@ -378,9 +384,14 @@ class MCPServer {
378
384
  // The directory that holds the home directories (/Users, /home); not when home sits in the root (/root).
379
385
  const homes = path.dirname(home);
380
386
  const otherHome = !inHome && path.dirname(homes) !== homes && inside(homes, real);
387
+ // Hidden directories at the top of the home (dotfiles, tool state) and the per-user app data (Library,
388
+ // AppData) hold keychains, browser profiles and tokens; .claude-worktrees holds Claude Code's git worktrees.
389
+ const top = path.relative(fold(home), fold(real)).split(path.sep)[0];
390
+ const inHomeData = inHome && top !== '.claude-worktrees' && (top.startsWith('.') || top === fold('Library') || top === fold('AppData'));
381
391
  const inSystem = !inHome && this.systemDirectories.some((dir) => inside(dir, real));
382
- const inCredentials = real.split(path.sep).some((segment) => this.credentialDirectories.includes(segment.toLowerCase()));
383
- if (inside(real, home) || otherHome || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
392
+ // Windows drops trailing dots and spaces from a name: .ssh. is .ssh.
393
+ const inCredentials = real.split(path.sep).some((segment) => this.credentialDirectories.includes((process.platform === 'win32' ? segment.replace(/[. ]+$/, '') : segment).toLowerCase()));
394
+ if (inside(real, home) || otherHome || inHomeData || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
384
395
  throw new Error('Refusing to deploy ' + localPath + ': it is, or contains, a home, system or credentials location. Pass the project directory or archive.');
385
396
  }
386
397
  }
@@ -388,13 +399,14 @@ class MCPServer {
388
399
  // Env files (examples such as .env.example are kept), credentials and private keys: a deploy would serve them
389
400
  // publicly. Matches the CLI's isSecretFile, plus .npmrc and the Hostinger credential files.
390
401
  isSecretFile(name) {
391
- if (['.env', '.envrc', '.netrc', '.git-credentials', '.pgpass', '.npmrc', '.hostinger.yaml', 'credentials.json'].includes(name)) {
402
+ if (['.env', '.envrc', '.netrc', '.git-credentials', '.pgpass', '.npmrc', '.hostinger.yaml', 'credentials.json', 'auth.json', '.my.cnf', '.pypirc', '.vault-token'].includes(name)) {
392
403
  return true;
393
404
  }
394
405
  if (['id_rsa', 'id_dsa', 'id_ecdsa', 'id_ed25519'].some((key) => name.startsWith(key))) {
395
406
  return true;
396
407
  }
397
- if (name.endsWith('.pem') || name.endsWith('.key')) {
408
+ // Shell and REPL histories, and Terraform state (it stores secrets in plain text).
409
+ if (name.endsWith('.pem') || name.endsWith('.key') || name.endsWith('_history') || name.endsWith('.tfstate') || name.endsWith('.tfstate.backup')) {
398
410
  return true;
399
411
  }
400
412
  return name.startsWith('.env.') && !['.env.example', '.env.sample', '.env.template', '.env.dist'].includes(name);
@@ -415,7 +427,10 @@ class MCPServer {
415
427
  }
416
428
  const relativePath = relativeDir ? relativeDir + '/' + entry.name : entry.name;
417
429
  if (entry.isDirectory()) {
418
- if (entry.name !== 'node_modules' && entry.name !== '.git') {
430
+ // Credential directories are left out and reported; a project's own .config/ ships.
431
+ if (entry.name !== '.config' && this.credentialDirectories.includes(entry.name.toLowerCase())) {
432
+ skipped.push(relativePath);
433
+ } else if (entry.name !== 'node_modules' && entry.name !== '.git') {
419
434
  walk(relativePath);
420
435
  }
421
436
  } else if (entry.isFile() && entry.name !== '.DS_Store' && path.resolve(dir, relativePath) !== exclude) {
@@ -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.0
97
+ * Generated from OpenAPI spec version 2.6.1
98
98
  */
99
99
  class MCPServer {
100
100
  private readonly name: string;
@@ -379,30 +379,36 @@ class MCPServer {
379
379
  // Directories that hold credentials, the server's own token store (hostinger-mcp) among them.
380
380
  private credentialDirectories = ['.ssh', '.aws', '.gnupg', '.config', '.kube', '.docker', '.azure', 'hostinger-mcp'];
381
381
 
382
- // System directories. /var as a whole stays deployable: sites live in /var/www, and macOS keeps its temp dir there.
383
- 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'];
382
+ // 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.
383
+ 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',
384
+ // Every user's home directory, whatever the current home is (root's is /root, a container's can be /).
385
+ '/home', '/Users', ...(process.platform === 'win32' ? [path.join(process.env.SystemDrive || 'C:', 'Users')] : [])];
384
386
 
385
387
  // A deploy publishes what it reads, and the path comes from the model, so prompt-injected arguments could
386
388
  // publish any readable file. Refused, before anything is read or sent: the home directory and every directory
387
389
  // above it (they contain the credentials), other users' home directories, system directories, a path in a
388
- // credential directory, and a secret file. Symlinks are resolved first.
390
+ // credential directory, and a secret file. The native realpath resolves symlinks and, on macOS
391
+ // and Windows, the on-disk case, 8.3 short names and trailing dots; a path it cannot resolve is refused.
389
392
  // os is imported by deploy.template: the JS generator dedupes import blocks by their whole text, and this block
390
393
  // must stay identical to agency-hosting/shared's, or tus and fs are imported twice.
391
394
  private assertDeployablePath(localPath: string): void {
392
395
  let real: string;
393
396
  try {
394
- real = fs.realpathSync(localPath);
397
+ real = fs.realpathSync.native(localPath);
395
398
  } catch (error) {
396
399
  throw new Error('Path not found: ' + localPath);
397
400
  }
398
401
  let home = os.homedir();
399
402
  try {
400
- home = fs.realpathSync(home);
403
+ home = fs.realpathSync.native(home);
401
404
  } catch (error) {
402
405
  // a missing home directory has nothing in it to protect
403
406
  }
407
+ // macOS and Windows file systems ignore case: /USERS/me is the home directory there.
408
+ const caseless = process.platform === 'darwin' || process.platform === 'win32';
409
+ const fold = (p: string): string => (caseless ? p.toLowerCase() : p);
404
410
  const inside = (dir: string, file: string): boolean => {
405
- const relative = path.relative(dir, file);
411
+ const relative = path.relative(fold(dir), fold(file));
406
412
  return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
407
413
  };
408
414
  // A home in the filesystem root (HOME=/ in a container run as a user without a passwd entry) exempts nothing.
@@ -410,9 +416,14 @@ class MCPServer {
410
416
  // The directory that holds the home directories (/Users, /home); not when home sits in the root (/root).
411
417
  const homes = path.dirname(home);
412
418
  const otherHome = !inHome && path.dirname(homes) !== homes && inside(homes, real);
419
+ // Hidden directories at the top of the home (dotfiles, tool state) and the per-user app data (Library,
420
+ // AppData) hold keychains, browser profiles and tokens; .claude-worktrees holds Claude Code's git worktrees.
421
+ const top = path.relative(fold(home), fold(real)).split(path.sep)[0];
422
+ const inHomeData = inHome && top !== '.claude-worktrees' && (top.startsWith('.') || top === fold('Library') || top === fold('AppData'));
413
423
  const inSystem = !inHome && this.systemDirectories.some((dir: string) => inside(dir, real));
414
- const inCredentials = real.split(path.sep).some((segment: string) => this.credentialDirectories.includes(segment.toLowerCase()));
415
- if (inside(real, home) || otherHome || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
424
+ // Windows drops trailing dots and spaces from a name: .ssh. is .ssh.
425
+ const inCredentials = real.split(path.sep).some((segment: string) => this.credentialDirectories.includes((process.platform === 'win32' ? segment.replace(/[. ]+$/, '') : segment).toLowerCase()));
426
+ if (inside(real, home) || otherHome || inHomeData || inSystem || inCredentials || (fs.statSync(real).isFile() && this.isSecretFile(path.basename(real)))) {
416
427
  throw new Error('Refusing to deploy ' + localPath + ': it is, or contains, a home, system or credentials location. Pass the project directory or archive.');
417
428
  }
418
429
  }
@@ -420,13 +431,14 @@ class MCPServer {
420
431
  // Env files (examples such as .env.example are kept), credentials and private keys: a deploy would serve them
421
432
  // publicly. Matches the CLI's isSecretFile, plus .npmrc and the Hostinger credential files.
422
433
  private isSecretFile(name: string): boolean {
423
- if (['.env', '.envrc', '.netrc', '.git-credentials', '.pgpass', '.npmrc', '.hostinger.yaml', 'credentials.json'].includes(name)) {
434
+ if (['.env', '.envrc', '.netrc', '.git-credentials', '.pgpass', '.npmrc', '.hostinger.yaml', 'credentials.json', 'auth.json', '.my.cnf', '.pypirc', '.vault-token'].includes(name)) {
424
435
  return true;
425
436
  }
426
437
  if (['id_rsa', 'id_dsa', 'id_ecdsa', 'id_ed25519'].some((key) => name.startsWith(key))) {
427
438
  return true;
428
439
  }
429
- if (name.endsWith('.pem') || name.endsWith('.key')) {
440
+ // Shell and REPL histories, and Terraform state (it stores secrets in plain text).
441
+ if (name.endsWith('.pem') || name.endsWith('.key') || name.endsWith('_history') || name.endsWith('.tfstate') || name.endsWith('.tfstate.backup')) {
430
442
  return true;
431
443
  }
432
444
  return name.startsWith('.env.') && !['.env.example', '.env.sample', '.env.template', '.env.dist'].includes(name);
@@ -447,7 +459,10 @@ class MCPServer {
447
459
  }
448
460
  const relativePath = relativeDir ? relativeDir + '/' + entry.name : entry.name;
449
461
  if (entry.isDirectory()) {
450
- if (entry.name !== 'node_modules' && entry.name !== '.git') {
462
+ // Credential directories are left out and reported; a project's own .config/ ships.
463
+ if (entry.name !== '.config' && this.credentialDirectories.includes(entry.name.toLowerCase())) {
464
+ skipped.push(relativePath);
465
+ } else if (entry.name !== 'node_modules' && entry.name !== '.git') {
451
466
  walk(relativePath);
452
467
  }
453
468
  } else if (entry.isFile() && entry.name !== '.DS_Store' && path.resolve(dir, relativePath) !== exclude) {
@@ -8103,7 +8103,7 @@ export default [
8103
8103
  "readOnlyHint": false,
8104
8104
  "destructiveHint": false
8105
8105
  },
8106
- "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged. Only send a report when the user agreed to it.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
8106
+ "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
8107
8107
  "method": "POST",
8108
8108
  "path": "/api/hosting/v1/headless/agent-reports",
8109
8109
  "inputSchema": {
@@ -8120,7 +8120,7 @@ const tools: OpenApiTool[] = [
8120
8120
  "readOnlyHint": false,
8121
8121
  "destructiveHint": false
8122
8122
  },
8123
- "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged. Only send a report when the user agreed to it.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
8123
+ "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
8124
8124
  "method": "POST",
8125
8125
  "path": "/api/hosting/v1/headless/agent-reports",
8126
8126
  "inputSchema": {
@@ -2413,7 +2413,7 @@ export default [
2413
2413
  "readOnlyHint": false,
2414
2414
  "destructiveHint": false
2415
2415
  },
2416
- "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged. Only send a report when the user agreed to it.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
2416
+ "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
2417
2417
  "method": "POST",
2418
2418
  "path": "/api/hosting/v1/headless/agent-reports",
2419
2419
  "inputSchema": {
@@ -2430,7 +2430,7 @@ const tools: OpenApiTool[] = [
2430
2430
  "readOnlyHint": false,
2431
2431
  "destructiveHint": false
2432
2432
  },
2433
- "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged. Only send a report when the user agreed to it.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
2433
+ "description": "Submits the build report the headless skill writes at the end of a run (including early\nstops), so Hostinger can learn where builds get stuck. Send one report per call, with the\nreport JSON as the request body, unchanged.\n\nThe report must match report.schema.json v1; an invalid report returns 422 and is not\nstored. The report is linked to the authenticated account, so do not add account details\nto it.",
2434
2434
  "method": "POST",
2435
2435
  "path": "/api/hosting/v1/headless/agent-reports",
2436
2436
  "inputSchema": {
@@ -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.22.1', tools, instructions });
7
+ startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.22.3', 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.22.1', tools, instructions });
7
+ startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.22.3', 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.22.1', tools, instructions, skills });
8
+ startServer({ name: 'hostinger-api-mcp', version: '3.22.3', 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.22.1', tools, instructions, skills });
8
+ startServer({ name: 'hostinger-api-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-billing-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-billing-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-dns-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-dns-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-domains-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-domains-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-ecommerce-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-ecommerce-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-horizons-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-horizons-mcp', version: '3.22.3', 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.22.1', tools, instructions });
7
+ startServer({ name: 'hostinger-hosting-mcp', version: '3.22.3', 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.22.1', tools, instructions });
7
+ startServer({ name: 'hostinger-hosting-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-mail-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-mail-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-reach-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-reach-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-vps-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-vps-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-wordpress-mcp', version: '3.22.3', 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.22.1', tools });
6
+ startServer({ name: 'hostinger-wordpress-mcp', version: '3.22.3', tools });
package/types.d.ts CHANGED
@@ -4602,7 +4602,7 @@ key to a private repository as a deploy key before deploying it.
4602
4602
  /**
4603
4603
  * Submits the build report the headless skill writes at the end of a run (including early
4604
4604
  stops), so Hostinger can learn where builds get stuck. Send one report per call, with the
4605
- report JSON as the request body, unchanged. Only send a report when the user agreed to it.
4605
+ report JSON as the request body, unchanged.
4606
4606
 
4607
4607
  The report must match report.schema.json v1; an invalid report returns 422 and is not
4608
4608
  stored. The report is linked to the authenticated account, so do not add account details