hostinger-api-mcp 3.27.0 → 3.27.1
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 +7 -0
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/headless/VERSION +2 -2
- package/src/core/runtime.js +25 -1
- package/src/core/runtime.ts +25 -1
- package/src/servers/agency-hosting.js +1 -1
- package/src/servers/agency-hosting.ts +1 -1
- package/src/servers/agent-readiness.js +1 -1
- package/src/servers/agent-readiness.ts +1 -1
- package/src/servers/all.js +1 -1
- package/src/servers/all.ts +1 -1
- package/src/servers/billing.js +1 -1
- package/src/servers/billing.ts +1 -1
- package/src/servers/dns.js +1 -1
- package/src/servers/dns.ts +1 -1
- package/src/servers/domains.js +1 -1
- package/src/servers/domains.ts +1 -1
- package/src/servers/ecommerce.js +1 -1
- package/src/servers/ecommerce.ts +1 -1
- package/src/servers/gpu.js +1 -1
- package/src/servers/gpu.ts +1 -1
- package/src/servers/horizons.js +1 -1
- package/src/servers/horizons.ts +1 -1
- package/src/servers/hosting.js +1 -1
- package/src/servers/hosting.ts +1 -1
- package/src/servers/mail.js +1 -1
- package/src/servers/mail.ts +1 -1
- package/src/servers/reach.js +1 -1
- package/src/servers/reach.ts +1 -1
- package/src/servers/vps.js +1 -1
- package/src/servers/vps.ts +1 -1
- package/src/servers/wordpress.js +1 -1
- package/src/servers/wordpress.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@ 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.1 — 2026-11-03
|
|
8
|
+
|
|
9
|
+
### Also in this release
|
|
10
|
+
|
|
11
|
+
- Bundled agent skills: `skills/headless/VERSION`
|
|
12
|
+
- Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
|
|
13
|
+
|
|
7
14
|
## v3.27.0 — 2026-11-03
|
|
8
15
|
|
|
9
16
|
### Operations
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
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.
|
|
9
|
+
"version": "3.27.1",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@hostinger/mcp",
|
|
14
|
-
"version": "3.27.
|
|
14
|
+
"version": "3.27.1",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
package/skills/headless/VERSION
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
version=3.27.
|
|
2
|
-
commit=
|
|
1
|
+
version=3.27.1
|
|
2
|
+
commit=f845254a4bae
|
|
3
3
|
built=2026-11-03
|
package/src/core/runtime.js
CHANGED
|
@@ -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
|
}
|
package/src/core/runtime.ts
CHANGED
|
@@ -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.
|
|
7
|
+
startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.27.1', 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.
|
|
7
|
+
startServer({ name: 'hostinger-agency-hosting-mcp', version: '3.27.1', 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.
|
|
6
|
+
startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.27.1', 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.
|
|
6
|
+
startServer({ name: 'hostinger-agent-readiness-mcp', version: '3.27.1', tools });
|
package/src/servers/all.js
CHANGED
|
@@ -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.
|
|
8
|
+
startServer({ name: 'hostinger-api-mcp', version: '3.27.1', tools, instructions, skills });
|
package/src/servers/all.ts
CHANGED
|
@@ -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.
|
|
8
|
+
startServer({ name: 'hostinger-api-mcp', version: '3.27.1', tools, instructions, skills });
|
package/src/servers/billing.js
CHANGED
package/src/servers/billing.ts
CHANGED
package/src/servers/dns.js
CHANGED
package/src/servers/dns.ts
CHANGED
package/src/servers/domains.js
CHANGED
package/src/servers/domains.ts
CHANGED
package/src/servers/ecommerce.js
CHANGED
package/src/servers/ecommerce.ts
CHANGED
package/src/servers/gpu.js
CHANGED
package/src/servers/gpu.ts
CHANGED
package/src/servers/horizons.js
CHANGED
package/src/servers/horizons.ts
CHANGED
package/src/servers/hosting.js
CHANGED
|
@@ -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.
|
|
7
|
+
startServer({ name: 'hostinger-hosting-mcp', version: '3.27.1', tools, instructions });
|
package/src/servers/hosting.ts
CHANGED
|
@@ -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.
|
|
7
|
+
startServer({ name: 'hostinger-hosting-mcp', version: '3.27.1', tools, instructions });
|
package/src/servers/mail.js
CHANGED
package/src/servers/mail.ts
CHANGED
package/src/servers/reach.js
CHANGED
package/src/servers/reach.ts
CHANGED
package/src/servers/vps.js
CHANGED
package/src/servers/vps.ts
CHANGED
package/src/servers/wordpress.js
CHANGED
package/src/servers/wordpress.ts
CHANGED