hostinger-api-mcp 3.19.2 → 3.20.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 +19 -0
- package/README.md +97 -13
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/core/instructions.agency-hosting.js +1 -1
- package/src/core/instructions.agency-hosting.ts +1 -1
- package/src/core/instructions.js +1 -1
- package/src/core/instructions.ts +1 -1
- package/src/core/runtime.js +63 -1
- package/src/core/runtime.ts +72 -1
- package/src/core/tools/agency-hosting.js +51 -0
- package/src/core/tools/agency-hosting.ts +52 -0
- package/src/core/tools/agent-readiness.js +51 -0
- package/src/core/tools/agent-readiness.ts +52 -0
- package/src/core/tools/all.js +51 -0
- package/src/core/tools/all.ts +52 -0
- package/src/core/tools/billing.js +51 -0
- package/src/core/tools/billing.ts +52 -0
- package/src/core/tools/dns.js +51 -0
- package/src/core/tools/dns.ts +52 -0
- package/src/core/tools/domains.js +51 -0
- package/src/core/tools/domains.ts +52 -0
- package/src/core/tools/ecommerce.js +51 -0
- package/src/core/tools/ecommerce.ts +52 -0
- package/src/core/tools/horizons.js +51 -0
- package/src/core/tools/horizons.ts +52 -0
- package/src/core/tools/hosting.js +51 -0
- package/src/core/tools/hosting.ts +52 -0
- package/src/core/tools/mail.js +51 -0
- package/src/core/tools/mail.ts +52 -0
- package/src/core/tools/reach.js +51 -0
- package/src/core/tools/reach.ts +52 -0
- package/src/core/tools/vps.js +51 -0
- package/src/core/tools/vps.ts +52 -0
- package/src/core/tools/wordpress.js +51 -0
- package/src/core/tools/wordpress.ts +52 -0
- 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/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/types.d.ts +25 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,25 @@ 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.20.1 — 2026-10-28
|
|
8
|
+
|
|
9
|
+
### Also in this release
|
|
10
|
+
|
|
11
|
+
- Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
|
|
12
|
+
|
|
13
|
+
## v3.20.0 — 2026-10-28
|
|
14
|
+
|
|
15
|
+
### Operations
|
|
16
|
+
|
|
17
|
+
- Added `changelog_list-entries` — List changelog and roadmap entries (what's new, what's coming)
|
|
18
|
+
|
|
19
|
+
### Also in this release
|
|
20
|
+
|
|
21
|
+
- Documentation: `README.md`
|
|
22
|
+
- Server instructions: 4 files
|
|
23
|
+
- Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
|
|
24
|
+
- Build and packaging: `types.d.ts`
|
|
25
|
+
|
|
7
26
|
## v3.19.2 — 2026-10-28
|
|
8
27
|
|
|
9
28
|
### Also in this release
|
package/README.md
CHANGED
|
@@ -69,19 +69,19 @@ 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 (
|
|
73
|
-
- `hostinger-agency-hosting-mcp` —
|
|
74
|
-
- `hostinger-agent-readiness-mcp` —
|
|
75
|
-
- `hostinger-billing-mcp` —
|
|
76
|
-
- `hostinger-dns-mcp` —
|
|
77
|
-
- `hostinger-domains-mcp` —
|
|
78
|
-
- `hostinger-ecommerce-mcp` —
|
|
79
|
-
- `hostinger-horizons-mcp` —
|
|
80
|
-
- `hostinger-hosting-mcp` —
|
|
81
|
-
- `hostinger-mail-mcp` —
|
|
82
|
-
- `hostinger-reach-mcp` —
|
|
83
|
-
- `hostinger-vps-mcp` —
|
|
84
|
-
- `hostinger-wordpress-mcp` —
|
|
72
|
+
- `hostinger-api-mcp` — unified server over every operation (413 total)
|
|
73
|
+
- `hostinger-agency-hosting-mcp` — 43 operations for agency-hosting
|
|
74
|
+
- `hostinger-agent-readiness-mcp` — 4 operations for agent-readiness
|
|
75
|
+
- `hostinger-billing-mcp` — 10 operations for billing
|
|
76
|
+
- `hostinger-dns-mcp` — 9 operations for dns
|
|
77
|
+
- `hostinger-domains-mcp` — 43 operations for domains
|
|
78
|
+
- `hostinger-ecommerce-mcp` — 30 operations for ecommerce
|
|
79
|
+
- `hostinger-horizons-mcp` — 7 operations for horizons
|
|
80
|
+
- `hostinger-hosting-mcp` — 62 operations for hosting
|
|
81
|
+
- `hostinger-mail-mcp` — 39 operations for mail
|
|
82
|
+
- `hostinger-reach-mcp` — 71 operations for reach
|
|
83
|
+
- `hostinger-vps-mcp` — 68 operations for vps
|
|
84
|
+
- `hostinger-wordpress-mcp` — 41 operations for wordpress
|
|
85
85
|
|
|
86
86
|
Every binary exposes the same three tools; a scoped binary only searches and executes its own group's operations. `hostinger-api-mcp` remains the backwards-compatible default.
|
|
87
87
|
|
|
@@ -235,6 +235,13 @@ Operations that newer tools replace are hidden from `search`, and not documented
|
|
|
235
235
|
|
|
236
236
|
### `hostinger-agency-hosting-mcp`
|
|
237
237
|
|
|
238
|
+
#### changelog_list-entries
|
|
239
|
+
|
|
240
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
241
|
+
|
|
242
|
+
- **Method**: `custom`
|
|
243
|
+
- **Path**: `custom`
|
|
244
|
+
|
|
238
245
|
#### agency-hosting_deploy-node-static-website
|
|
239
246
|
|
|
240
247
|
Deploy a node-static Agency Plan (h5g) website from an archive file. WARNING: this overwrites the website's existing contents and cannot be undone — always confirm with the user before proceeding. Use this for Agency Plan websites of type node-static (a Node.js-built static site that requires a build step or a plain simple static site). The tool resolves the website from its domain, uploads the archive to the website's file browser over TUS, and triggers the build-assets process which builds the site and deploys the result to public_html. This operation is synchronous: the build and deployment complete before the tool returns, so the website is live as soon as the tool finishes successfully — there is no separate asynchronous build to wait for or poll. Upload credentials are generated and used internally — do not call a separate upload-url endpoint or upload the archive yourself, this tool does it end-to-end. For plain PHP applications that should be extracted as-is, use agency-hosting_deploy-php-application instead. The website UID is automatically resolved from the domain.
|
|
@@ -685,6 +692,13 @@ Lists the WordPress core versions available for installation on an Agency Plan w
|
|
|
685
692
|
|
|
686
693
|
### `hostinger-agent-readiness-mcp`
|
|
687
694
|
|
|
695
|
+
#### changelog_list-entries
|
|
696
|
+
|
|
697
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
698
|
+
|
|
699
|
+
- **Method**: `custom`
|
|
700
|
+
- **Path**: `custom`
|
|
701
|
+
|
|
688
702
|
#### agent-readiness_checks_list
|
|
689
703
|
|
|
690
704
|
List every check an agent readiness scan runs, with its name, category and weight.\n
|
|
@@ -721,6 +735,13 @@ Returns 404 when the domain has never been scanned; use the `Run agent readiness
|
|
|
721
735
|
|
|
722
736
|
### `hostinger-billing-mcp`
|
|
723
737
|
|
|
738
|
+
#### changelog_list-entries
|
|
739
|
+
|
|
740
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
741
|
+
|
|
742
|
+
- **Method**: `custom`
|
|
743
|
+
- **Path**: `custom`
|
|
744
|
+
|
|
724
745
|
#### billing_catalog_list
|
|
725
746
|
|
|
726
747
|
Retrieve catalog items available for order.
|
|
@@ -835,6 +856,13 @@ Use this endpoint to renew any subscription available in your account.
|
|
|
835
856
|
|
|
836
857
|
### `hostinger-dns-mcp`
|
|
837
858
|
|
|
859
|
+
#### changelog_list-entries
|
|
860
|
+
|
|
861
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
862
|
+
|
|
863
|
+
- **Method**: `custom`
|
|
864
|
+
- **Path**: `custom`
|
|
865
|
+
|
|
838
866
|
#### dns_snapshots_get
|
|
839
867
|
|
|
840
868
|
Retrieve particular DNS snapshot with contents of DNS zone records.
|
|
@@ -921,6 +949,13 @@ Use this endpoint to verify DNS record validity before applying changes.
|
|
|
921
949
|
|
|
922
950
|
### `hostinger-domains-mcp`
|
|
923
951
|
|
|
952
|
+
#### changelog_list-entries
|
|
953
|
+
|
|
954
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
955
|
+
|
|
956
|
+
- **Method**: `custom`
|
|
957
|
+
- **Path**: `custom`
|
|
958
|
+
|
|
924
959
|
#### domains_verifications_direct
|
|
925
960
|
|
|
926
961
|
Retrieve a list of pending and completed domain verifications.
|
|
@@ -1455,6 +1490,13 @@ Use this endpoint to view which domains use specific contact profiles.
|
|
|
1455
1490
|
|
|
1456
1491
|
### `hostinger-ecommerce-mcp`
|
|
1457
1492
|
|
|
1493
|
+
#### changelog_list-entries
|
|
1494
|
+
|
|
1495
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
1496
|
+
|
|
1497
|
+
- **Method**: `custom`
|
|
1498
|
+
- **Path**: `custom`
|
|
1499
|
+
|
|
1458
1500
|
#### ecommerce_discounts_list
|
|
1459
1501
|
|
|
1460
1502
|
List a store's discounts. Filter by free text over code and name, or by disabled state.
|
|
@@ -1700,6 +1742,13 @@ store currency. Returns the created variant.
|
|
|
1700
1742
|
|
|
1701
1743
|
### `hostinger-horizons-mcp`
|
|
1702
1744
|
|
|
1745
|
+
#### changelog_list-entries
|
|
1746
|
+
|
|
1747
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
1748
|
+
|
|
1749
|
+
- **Method**: `custom`
|
|
1750
|
+
- **Path**: `custom`
|
|
1751
|
+
|
|
1703
1752
|
#### horizons_websites_clone
|
|
1704
1753
|
|
|
1705
1754
|
Clone a Hostinger Horizons website into a new website.\n
|
|
@@ -1814,6 +1863,13 @@ interface in the provided website URL.
|
|
|
1814
1863
|
|
|
1815
1864
|
### `hostinger-hosting-mcp`
|
|
1816
1865
|
|
|
1866
|
+
#### changelog_list-entries
|
|
1867
|
+
|
|
1868
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
1869
|
+
|
|
1870
|
+
- **Method**: `custom`
|
|
1871
|
+
- **Path**: `custom`
|
|
1872
|
+
|
|
1817
1873
|
#### hosting_deploy
|
|
1818
1874
|
|
|
1819
1875
|
Deploy, publish or upload a website to Hostinger web hosting (Shared, Cloud): static HTML, PHP, a nodejs (Node.js) app, a whole WordPress site, or a WordPress plugin or theme, from a local directory, an archive or a GitHub or GitLab repository. It detects what the project is and does the upload, build and Git setup itself: do not call upload or build operations, and do not archive the directory yourself. WARNING: it overwrites the website's contents and cannot be undone; confirm the domain with the user before deploying to a site that already has content. A Node.js build runs on the server: this returns a buildUuid at once, then call hosting_get-deployment until the build state is completed or failed. A plugin or theme goes into the site's WordPress installation, also when WordPress is in a folder of the document root (headless). Static, PHP, plugin and theme deploys are done when this returns; a WordPress site import only starts, and its files are extracted a few minutes later. From Git, pass type (static or nodejs) unless the site already runs a Node.js app or you pass Node.js settings; a static or PHP site deploys the branch now and again on every push; a Node.js site builds the branch now and on every later push, with the settings stored for the site (when none are stored, they are detected from the branch's package.json; pass appType, nodeVersion, outputDirectory, buildScript or entryFile to override them). Git needs GitHub or GitLab connected once in hPanel.
|
|
@@ -2567,6 +2623,13 @@ complete. The response returns before the removal finishes.
|
|
|
2567
2623
|
|
|
2568
2624
|
### `hostinger-mail-mcp`
|
|
2569
2625
|
|
|
2626
|
+
#### changelog_list-entries
|
|
2627
|
+
|
|
2628
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
2629
|
+
|
|
2630
|
+
- **Method**: `custom`
|
|
2631
|
+
- **Path**: `custom`
|
|
2632
|
+
|
|
2570
2633
|
#### mail_aliases_create-alias
|
|
2571
2634
|
|
|
2572
2635
|
Create an alias for the given mailbox. The alias address is formed
|
|
@@ -2909,6 +2972,13 @@ requests are rate limited upstream.
|
|
|
2909
2972
|
|
|
2910
2973
|
### `hostinger-reach-mcp`
|
|
2911
2974
|
|
|
2975
|
+
#### changelog_list-entries
|
|
2976
|
+
|
|
2977
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
2978
|
+
|
|
2979
|
+
- **Method**: `custom`
|
|
2980
|
+
- **Path**: `custom`
|
|
2981
|
+
|
|
2912
2982
|
#### reach_automations_get
|
|
2913
2983
|
|
|
2914
2984
|
Get a single automation with the counts of contacts that entered it, are moving through it,
|
|
@@ -3736,6 +3806,13 @@ from the WordPress plugin - so confirm the site and the plan with the customer b
|
|
|
3736
3806
|
|
|
3737
3807
|
### `hostinger-vps-mcp`
|
|
3738
3808
|
|
|
3809
|
+
#### changelog_list-entries
|
|
3810
|
+
|
|
3811
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
3812
|
+
|
|
3813
|
+
- **Method**: `custom`
|
|
3814
|
+
- **Path**: `custom`
|
|
3815
|
+
|
|
3739
3816
|
#### vps_data-centers_list
|
|
3740
3817
|
|
|
3741
3818
|
Retrieve all available data centers.
|
|
@@ -4528,6 +4605,13 @@ Use this endpoint to power off running VPS instances.
|
|
|
4528
4605
|
|
|
4529
4606
|
### `hostinger-wordpress-mcp`
|
|
4530
4607
|
|
|
4608
|
+
#### changelog_list-entries
|
|
4609
|
+
|
|
4610
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
4611
|
+
|
|
4612
|
+
- **Method**: `custom`
|
|
4613
|
+
- **Path**: `custom`
|
|
4614
|
+
|
|
4531
4615
|
#### wordpress_ai-content_generate-images
|
|
4532
4616
|
|
|
4533
4617
|
Start generating one or more images from a prompt and an image type for the specified
|
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.
|
|
9
|
+
"version": "3.20.1",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@hostinger/mcp",
|
|
14
|
-
"version": "3.
|
|
14
|
+
"version": "3.20.1",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated server instructions
|
|
2
|
-
export default "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
2
|
+
export default "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nProduct updates\n- For what is new at Hostinger (release notes, recent changes, new features), call changelog_list-entries, filtered by `product` and `since`. For what is coming (the roadmap), call it with `status: upcoming`. It needs no API token.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Auto-generated server instructions
|
|
2
|
-
const instructions: string = "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
2
|
+
const instructions: string = "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nProduct updates\n- For what is new at Hostinger (release notes, recent changes, new features), call changelog_list-entries, filtered by `product` and `since`. For what is coming (the roadmap), call it with `status: upcoming`. It needs no API token.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
3
3
|
export default instructions;
|
package/src/core/instructions.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated server instructions
|
|
2
|
-
export default "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nDeploying a website (this server only)\n- hosting_deploy replaces the upload, archive-deploy, build, WordPress import/plugin/theme and Git operations named above. Give it a local directory (it detects static/PHP, Node.js, a WordPress site, plugin or theme and packs it itself), a local archive with `type`, or `git: { repository, branch }`. Do not run those operations by hand.\n- A Node.js deploy returns a buildUuid at once and builds on the server. Poll hosting_get-deployment with the domain, pausing longer each time, until the build state is completed or failed. A failed build comes back with its logs and analysis: fix the cause and deploy again. It replaces the build, log and settings operations.\n- Static, PHP, plugin and theme deploys are complete when hosting_deploy returns. A WordPress site import only starts: its files are extracted and the site is ready a few minutes later.\n- Every deploy overwrites the site's contents: confirm the domain with the user before the first deploy to a site that already has content.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
2
|
+
export default "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nDeploying a website (this server only)\n- hosting_deploy replaces the upload, archive-deploy, build, WordPress import/plugin/theme and Git operations named above. Give it a local directory (it detects static/PHP, Node.js, a WordPress site, plugin or theme and packs it itself), a local archive with `type`, or `git: { repository, branch }`. Do not run those operations by hand.\n- A Node.js deploy returns a buildUuid at once and builds on the server. Poll hosting_get-deployment with the domain, pausing longer each time, until the build state is completed or failed. A failed build comes back with its logs and analysis: fix the cause and deploy again. It replaces the build, log and settings operations.\n- Static, PHP, plugin and theme deploys are complete when hosting_deploy returns. A WordPress site import only starts: its files are extracted and the site is ready a few minutes later.\n- Every deploy overwrites the site's contents: confirm the domain with the user before the first deploy to a site that already has content.\n\nProduct updates\n- For what is new at Hostinger (release notes, recent changes, new features), call changelog_list-entries, filtered by `product` and `since`. For what is coming (the roadmap), call it with `status: upcoming`. It needs no API token.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
package/src/core/instructions.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Auto-generated server instructions
|
|
2
|
-
const instructions: string = "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nDeploying a website (this server only)\n- hosting_deploy replaces the upload, archive-deploy, build, WordPress import/plugin/theme and Git operations named above. Give it a local directory (it detects static/PHP, Node.js, a WordPress site, plugin or theme and packs it itself), a local archive with `type`, or `git: { repository, branch }`. Do not run those operations by hand.\n- A Node.js deploy returns a buildUuid at once and builds on the server. Poll hosting_get-deployment with the domain, pausing longer each time, until the build state is completed or failed. A failed build comes back with its logs and analysis: fix the cause and deploy again. It replaces the build, log and settings operations.\n- Static, PHP, plugin and theme deploys are complete when hosting_deploy returns. A WordPress site import only starts: its files are extracted and the site is ready a few minutes later.\n- Every deploy overwrites the site's contents: confirm the domain with the user before the first deploy to a site that already has content.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
2
|
+
const instructions: string = "Hostinger API notes for agents. Find operations with search; the inputSchema it returns is authoritative for request shapes. Run one with execute, or chain several with multi-execute.\n\nDatabases (web hosting, hosting_* operations)\n- MySQL runs on the same server as the website. From the deployed app connect to host 127.0.0.1, port 3306. PHP may also use localhost (Unix socket). Node.js should use 127.0.0.1: localhost can resolve to IPv6 (::1) and not every database user has that grant.\n- The `host` from hosting_databases_list (srvNNNN.hstgr.io) is only for connections from outside Hostinger, after hosting_databases_create-remote-connection. Never use it from the app.\n- Agency Plan (agency-hosting_* operations) database users are created for localhost; the PHP app connects there.\n\nAsynchronous operations\n- A success response often means \"queued\", not \"done\". Poll the matching read operation with backoff (seconds, then minutes). Never re-send the write.\n- hosting_websites_create -> poll hosting_websites_list-setups with the domain until status is completed (a few minutes); file, deploy and database calls return 404/409 before that.\n- A Node.js deploy or hosting_nodejs_start-build -> poll hosting_get-deployment with the domain until the build state is completed or failed; a failed build comes back with its logs and failure analysis.\n- wordpress_installations_install and WordPress plugin/theme/core jobs -> poll wordpress_installations_list.\n- agency-hosting_website-setups_create -> poll agency-hosting_website-setups_status with setup_uuid; other Agency Plan jobs -> agency-hosting_websites_list-processes.\n- Website deletion, database repair and domain contact changes finish in the background.\n\nCredentials\n- Never write database passwords or API tokens into source code, client-side JavaScript or committed .env files.\n- Node.js apps read them from environment variables: set the full set with hosting_nodejs_replace-environment-variables (full replace; values are masked on read). Build-time variables (Next.js) need a new build afterwards.\n- PHP apps read them from a config file on the server, outside the repository.\n- Generate strong passwords and do not echo them back once stored.\n\nDeploying from a shell\n- The Hostinger CLI deploys a website in one command and links the directory: `hostinger up <dir> --domain <domain> --format json` (`--yes` replaces content, `--create` makes a site, `--dry-run` shows the plan). It never prompts without a terminal.\n\nDeploying a website (this server only)\n- hosting_deploy replaces the upload, archive-deploy, build, WordPress import/plugin/theme and Git operations named above. Give it a local directory (it detects static/PHP, Node.js, a WordPress site, plugin or theme and packs it itself), a local archive with `type`, or `git: { repository, branch }`. Do not run those operations by hand.\n- A Node.js deploy returns a buildUuid at once and builds on the server. Poll hosting_get-deployment with the domain, pausing longer each time, until the build state is completed or failed. A failed build comes back with its logs and analysis: fix the cause and deploy again. It replaces the build, log and settings operations.\n- Static, PHP, plugin and theme deploys are complete when hosting_deploy returns. A WordPress site import only starts: its files are extracted and the site is ready a few minutes later.\n- Every deploy overwrites the site's contents: confirm the domain with the user before the first deploy to a site that already has content.\n\nProduct updates\n- For what is new at Hostinger (release notes, recent changes, new features), call changelog_list-entries, filtered by `product` and `since`. For what is coming (the roadmap), call it with `status: upcoming`. It needs no API token.\n\nFor end-to-end site builds install the headless skill: npx skills add hostinger/api-mcp-server";
|
|
3
3
|
export default instructions;
|
package/src/core/runtime.js
CHANGED
|
@@ -66,7 +66,7 @@ const GetSkillRequestSchema = z.object({
|
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* MCP Server for Hostinger API
|
|
69
|
-
* Generated from OpenAPI spec version 2.5.
|
|
69
|
+
* Generated from OpenAPI spec version 2.5.1
|
|
70
70
|
*/
|
|
71
71
|
class MCPServer {
|
|
72
72
|
constructor({ name, version, tools, instructions, skills = [] }) {
|
|
@@ -328,6 +328,8 @@ class MCPServer {
|
|
|
328
328
|
return await this.handleNodeStaticDeploy(params);
|
|
329
329
|
case 'agency-hosting_deploy-php-application':
|
|
330
330
|
return await this.handlePhpAppDeploy(params);
|
|
331
|
+
case 'changelog_list-entries':
|
|
332
|
+
return await this.handleChangelogListEntries(params);
|
|
331
333
|
default:
|
|
332
334
|
throw new Error(`Unknown custom tool: ${tool.name}`);
|
|
333
335
|
}
|
|
@@ -3509,6 +3511,66 @@ class MCPServer {
|
|
|
3509
3511
|
};
|
|
3510
3512
|
}
|
|
3511
3513
|
|
|
3514
|
+
async handleChangelogListEntries(params) {
|
|
3515
|
+
// Their key order is the order of the results: upcoming items, then released entries.
|
|
3516
|
+
const CHANGELOG_FEEDS = {
|
|
3517
|
+
upcoming: "https://www.hostinger.com/roadmap/feed.json",
|
|
3518
|
+
released: "https://www.hostinger.com/changelog/feed.json",
|
|
3519
|
+
};
|
|
3520
|
+
// Agents often send null for an optional field they don't use; treat it as unset.
|
|
3521
|
+
const { status = 'released', product, since, limit = 20 } = Object.fromEntries(Object.entries(params).filter(([, value]) => value !== null));
|
|
3522
|
+
const feedStatuses = Object.keys(CHANGELOG_FEEDS);
|
|
3523
|
+
if (status !== 'all' && !feedStatuses.includes(status)) {
|
|
3524
|
+
throw new Error('status must be one of: ' + [...feedStatuses, 'all'].join(', '));
|
|
3525
|
+
}
|
|
3526
|
+
if (typeof limit !== 'number' || !Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
3527
|
+
throw new Error('limit must be an integer from 1 to 100');
|
|
3528
|
+
}
|
|
3529
|
+
const sinceTime = since === undefined ? undefined : Date.parse(String(since));
|
|
3530
|
+
// Only a real YYYY-MM-DD day, the one form that reads back unchanged: Date.parse also takes "Oct 1"
|
|
3531
|
+
// (as 2001-10-01) and rolls 2026-02-30 over to March.
|
|
3532
|
+
if (sinceTime !== undefined && (Number.isNaN(sinceTime) || new Date(sinceTime).toISOString().slice(0, 10) !== since)) {
|
|
3533
|
+
throw new Error(`since must be a day as YYYY-MM-DD: ${since}`);
|
|
3534
|
+
}
|
|
3535
|
+
const sameText = (a, b) => String(a).toLowerCase() === String(b).toLowerCase();
|
|
3536
|
+
const time = (date, ifMissing) => Date.parse(date ?? '') || ifMissing;
|
|
3537
|
+
|
|
3538
|
+
const statuses = status === 'all' ? feedStatuses : [status];
|
|
3539
|
+
const entriesPerFeed = await Promise.all(statuses.map(async feedStatus => {
|
|
3540
|
+
const feed = CHANGELOG_FEEDS[feedStatus];
|
|
3541
|
+
// The feeds are public: send only the User-Agent, never the API headers.
|
|
3542
|
+
const response = await axios.get(feed, { headers: { 'User-Agent': this.headers['User-Agent'] }, timeout: 30000 })
|
|
3543
|
+
.catch((error) => { throw new Error(`${feed} could not be read: ${error.message}`); });
|
|
3544
|
+
if (!Array.isArray(response.data?.items)) {
|
|
3545
|
+
throw new Error(`${feed} returned no items (HTTP ${response.status})`);
|
|
3546
|
+
}
|
|
3547
|
+
// The feed sets the status: the changelog lists only released entries, the roadmap only unreleased items.
|
|
3548
|
+
const toEntry = (item) => ({
|
|
3549
|
+
title: item.title,
|
|
3550
|
+
summary: item.summary,
|
|
3551
|
+
product: item._hostinger?.product,
|
|
3552
|
+
url: new URL(item.url, feed).toString(),
|
|
3553
|
+
status: feedStatus,
|
|
3554
|
+
plan: item._hostinger?.plan,
|
|
3555
|
+
});
|
|
3556
|
+
if (feedStatus === 'released') {
|
|
3557
|
+
const publishedTime = (item) => time(item.date_published, 0);
|
|
3558
|
+
return response.data.items
|
|
3559
|
+
.filter(item => sinceTime === undefined || publishedTime(item) >= sinceTime)
|
|
3560
|
+
.sort((a, b) => publishedTime(b) - publishedTime(a))
|
|
3561
|
+
.map(item => ({ ...toEntry(item), date: item.date_published }));
|
|
3562
|
+
}
|
|
3563
|
+
// Roadmap items have no publication date: soonest expected release first, unknown dates last.
|
|
3564
|
+
const releaseTime = (item) => time(item._hostinger?.expected_release_date, Number.MAX_SAFE_INTEGER);
|
|
3565
|
+
return response.data.items
|
|
3566
|
+
.sort((a, b) => releaseTime(a) - releaseTime(b))
|
|
3567
|
+
.map(item => ({ ...toEntry(item), expected_release_date: item._hostinger?.expected_release_date }));
|
|
3568
|
+
}));
|
|
3569
|
+
const entries = entriesPerFeed.flat().filter(entry => product === undefined || sameText(entry.product, product));
|
|
3570
|
+
|
|
3571
|
+
return { feeds: statuses.map(feedStatus => CHANGELOG_FEEDS[feedStatus]), matched: entries.length, entries: entries.slice(0, limit) };
|
|
3572
|
+
}
|
|
3573
|
+
|
|
3512
3574
|
/**
|
|
3513
3575
|
* Execute an API call for a tool
|
|
3514
3576
|
*/
|
package/src/core/runtime.ts
CHANGED
|
@@ -39,6 +39,7 @@ interface OpenApiTool extends Tool {
|
|
|
39
39
|
custom?: boolean;
|
|
40
40
|
hidden?: boolean;
|
|
41
41
|
group?: string;
|
|
42
|
+
everyServer?: boolean;
|
|
42
43
|
topic?: string;
|
|
43
44
|
handlerMethod?: string;
|
|
44
45
|
templateFile?: string;
|
|
@@ -97,7 +98,7 @@ interface Skill { uri: string; frontmatter: Record<string, unknown>; resources:
|
|
|
97
98
|
|
|
98
99
|
/**
|
|
99
100
|
* MCP Server for Hostinger API
|
|
100
|
-
* Generated from OpenAPI spec version 2.5.
|
|
101
|
+
* Generated from OpenAPI spec version 2.5.1
|
|
101
102
|
*/
|
|
102
103
|
class MCPServer {
|
|
103
104
|
private readonly name: string;
|
|
@@ -359,6 +360,8 @@ class MCPServer {
|
|
|
359
360
|
return await this.handleNodeStaticDeploy(params);
|
|
360
361
|
case 'agency-hosting_deploy-php-application':
|
|
361
362
|
return await this.handlePhpAppDeploy(params);
|
|
363
|
+
case 'changelog_list-entries':
|
|
364
|
+
return await this.handleChangelogListEntries(params);
|
|
362
365
|
default:
|
|
363
366
|
throw new Error(`Unknown custom tool: ${tool.name}`);
|
|
364
367
|
}
|
|
@@ -3554,6 +3557,74 @@ class MCPServer {
|
|
|
3554
3557
|
};
|
|
3555
3558
|
}
|
|
3556
3559
|
|
|
3560
|
+
private async handleChangelogListEntries(params: Record<string, unknown>): Promise<unknown> {
|
|
3561
|
+
// Their key order is the order of the results: upcoming items, then released entries.
|
|
3562
|
+
const CHANGELOG_FEEDS = {
|
|
3563
|
+
upcoming: "https://www.hostinger.com/roadmap/feed.json",
|
|
3564
|
+
released: "https://www.hostinger.com/changelog/feed.json",
|
|
3565
|
+
} as const;
|
|
3566
|
+
type ChangelogStatus = keyof typeof CHANGELOG_FEEDS;
|
|
3567
|
+
interface ChangelogFeedItem {
|
|
3568
|
+
url: string;
|
|
3569
|
+
title: string;
|
|
3570
|
+
summary?: string;
|
|
3571
|
+
date_published?: string;
|
|
3572
|
+
_hostinger?: { product?: string; plan?: string[]; expected_release_date?: string };
|
|
3573
|
+
}
|
|
3574
|
+
// Agents often send null for an optional field they don't use; treat it as unset.
|
|
3575
|
+
const { status = 'released', product, since, limit = 20 } = Object.fromEntries(Object.entries(params).filter(([, value]) => value !== null));
|
|
3576
|
+
const feedStatuses = Object.keys(CHANGELOG_FEEDS) as ChangelogStatus[];
|
|
3577
|
+
if (status !== 'all' && !feedStatuses.includes(status as ChangelogStatus)) {
|
|
3578
|
+
throw new Error('status must be one of: ' + [...feedStatuses, 'all'].join(', '));
|
|
3579
|
+
}
|
|
3580
|
+
if (typeof limit !== 'number' || !Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
3581
|
+
throw new Error('limit must be an integer from 1 to 100');
|
|
3582
|
+
}
|
|
3583
|
+
const sinceTime = since === undefined ? undefined : Date.parse(String(since));
|
|
3584
|
+
// Only a real YYYY-MM-DD day, the one form that reads back unchanged: Date.parse also takes "Oct 1"
|
|
3585
|
+
// (as 2001-10-01) and rolls 2026-02-30 over to March.
|
|
3586
|
+
if (sinceTime !== undefined && (Number.isNaN(sinceTime) || new Date(sinceTime).toISOString().slice(0, 10) !== since)) {
|
|
3587
|
+
throw new Error(`since must be a day as YYYY-MM-DD: ${since}`);
|
|
3588
|
+
}
|
|
3589
|
+
const sameText = (a: unknown, b: unknown): boolean => String(a).toLowerCase() === String(b).toLowerCase();
|
|
3590
|
+
const time = (date: string | undefined, ifMissing: number): number => Date.parse(date ?? '') || ifMissing;
|
|
3591
|
+
|
|
3592
|
+
const statuses = status === 'all' ? feedStatuses : [status as ChangelogStatus];
|
|
3593
|
+
const entriesPerFeed = await Promise.all(statuses.map(async feedStatus => {
|
|
3594
|
+
const feed = CHANGELOG_FEEDS[feedStatus];
|
|
3595
|
+
// The feeds are public: send only the User-Agent, never the API headers.
|
|
3596
|
+
const response = await axios.get<{ items?: ChangelogFeedItem[] }>(feed, { headers: { 'User-Agent': this.headers['User-Agent'] }, timeout: 30000 })
|
|
3597
|
+
.catch((error: Error) => { throw new Error(`${feed} could not be read: ${error.message}`); });
|
|
3598
|
+
if (!Array.isArray(response.data?.items)) {
|
|
3599
|
+
throw new Error(`${feed} returned no items (HTTP ${response.status})`);
|
|
3600
|
+
}
|
|
3601
|
+
// The feed sets the status: the changelog lists only released entries, the roadmap only unreleased items.
|
|
3602
|
+
const toEntry = (item: ChangelogFeedItem) => ({
|
|
3603
|
+
title: item.title,
|
|
3604
|
+
summary: item.summary,
|
|
3605
|
+
product: item._hostinger?.product,
|
|
3606
|
+
url: new URL(item.url, feed).toString(),
|
|
3607
|
+
status: feedStatus,
|
|
3608
|
+
plan: item._hostinger?.plan,
|
|
3609
|
+
});
|
|
3610
|
+
if (feedStatus === 'released') {
|
|
3611
|
+
const publishedTime = (item: ChangelogFeedItem): number => time(item.date_published, 0);
|
|
3612
|
+
return response.data.items
|
|
3613
|
+
.filter(item => sinceTime === undefined || publishedTime(item) >= sinceTime)
|
|
3614
|
+
.sort((a, b) => publishedTime(b) - publishedTime(a))
|
|
3615
|
+
.map(item => ({ ...toEntry(item), date: item.date_published }));
|
|
3616
|
+
}
|
|
3617
|
+
// Roadmap items have no publication date: soonest expected release first, unknown dates last.
|
|
3618
|
+
const releaseTime = (item: ChangelogFeedItem): number => time(item._hostinger?.expected_release_date, Number.MAX_SAFE_INTEGER);
|
|
3619
|
+
return response.data.items
|
|
3620
|
+
.sort((a, b) => releaseTime(a) - releaseTime(b))
|
|
3621
|
+
.map(item => ({ ...toEntry(item), expected_release_date: item._hostinger?.expected_release_date }));
|
|
3622
|
+
}));
|
|
3623
|
+
const entries = entriesPerFeed.flat().filter(entry => product === undefined || sameText(entry.product, product));
|
|
3624
|
+
|
|
3625
|
+
return { feeds: statuses.map(feedStatus => CHANGELOG_FEEDS[feedStatus]), matched: entries.length, entries: entries.slice(0, limit) };
|
|
3626
|
+
}
|
|
3627
|
+
|
|
3557
3628
|
/**
|
|
3558
3629
|
* Execute an API call for a tool
|
|
3559
3630
|
*/
|
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
// Auto-generated tool list for group: agency-hosting
|
|
2
2
|
export default [
|
|
3
|
+
{
|
|
4
|
+
"name": "changelog_list-entries",
|
|
5
|
+
"title": "List changelog and roadmap entries (what's new, what's coming)",
|
|
6
|
+
"annotations": {
|
|
7
|
+
"title": "List changelog and roadmap entries (what's new, what's coming)",
|
|
8
|
+
"readOnlyHint": true,
|
|
9
|
+
"destructiveHint": false
|
|
10
|
+
},
|
|
11
|
+
"topic": "common",
|
|
12
|
+
"description": "What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.",
|
|
13
|
+
"method": "",
|
|
14
|
+
"path": "",
|
|
15
|
+
"inputSchema": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": {
|
|
18
|
+
"status": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Which entries to list: released (default) reads the changelog, for what's new; upcoming reads the roadmap's unreleased items, for what's coming; all reads both.",
|
|
21
|
+
"enum": [
|
|
22
|
+
"released",
|
|
23
|
+
"upcoming",
|
|
24
|
+
"all"
|
|
25
|
+
],
|
|
26
|
+
"default": "released"
|
|
27
|
+
},
|
|
28
|
+
"product": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"description": "Only entries for this product, matched case-insensitively. Products include AI Builder, Web Hosting, VPS, Domains, Hostinger Mail, Reach, Ecommerce, WordPress, Hostinger Agent, AI Automation Apps, Web Pro, Billing, Growth and Payments."
|
|
31
|
+
},
|
|
32
|
+
"since": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"format": "date",
|
|
35
|
+
"description": "Only released entries dated on or after this date, as YYYY-MM-DD. Upcoming items are not filtered by date."
|
|
36
|
+
},
|
|
37
|
+
"limit": {
|
|
38
|
+
"type": "integer",
|
|
39
|
+
"description": "Most entries to return",
|
|
40
|
+
"minimum": 1,
|
|
41
|
+
"maximum": 100,
|
|
42
|
+
"default": 20
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"required": []
|
|
46
|
+
},
|
|
47
|
+
"security": [],
|
|
48
|
+
"custom": true,
|
|
49
|
+
"templateFile": "list-changelog-entries.template.js",
|
|
50
|
+
"templateFileTS": "list-changelog-entries.template.ts",
|
|
51
|
+
"handlerMethod": "handleChangelogListEntries",
|
|
52
|
+
"everyServer": true
|
|
53
|
+
},
|
|
3
54
|
{
|
|
4
55
|
"name": "agency-hosting_deploy-node-static-website",
|
|
5
56
|
"title": "Deploy node-static website",
|