hostinger-api-mcp 3.19.2 → 3.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +97 -13
  3. package/gemini-extension.json +1 -1
  4. package/package.json +1 -1
  5. package/server.json +2 -2
  6. package/src/core/instructions.agency-hosting.js +1 -1
  7. package/src/core/instructions.agency-hosting.ts +1 -1
  8. package/src/core/instructions.js +1 -1
  9. package/src/core/instructions.ts +1 -1
  10. package/src/core/runtime.js +62 -0
  11. package/src/core/runtime.ts +71 -0
  12. package/src/core/tools/agency-hosting.js +51 -0
  13. package/src/core/tools/agency-hosting.ts +52 -0
  14. package/src/core/tools/agent-readiness.js +51 -0
  15. package/src/core/tools/agent-readiness.ts +52 -0
  16. package/src/core/tools/all.js +51 -0
  17. package/src/core/tools/all.ts +52 -0
  18. package/src/core/tools/billing.js +51 -0
  19. package/src/core/tools/billing.ts +52 -0
  20. package/src/core/tools/dns.js +51 -0
  21. package/src/core/tools/dns.ts +52 -0
  22. package/src/core/tools/domains.js +51 -0
  23. package/src/core/tools/domains.ts +52 -0
  24. package/src/core/tools/ecommerce.js +51 -0
  25. package/src/core/tools/ecommerce.ts +52 -0
  26. package/src/core/tools/horizons.js +51 -0
  27. package/src/core/tools/horizons.ts +52 -0
  28. package/src/core/tools/hosting.js +51 -0
  29. package/src/core/tools/hosting.ts +52 -0
  30. package/src/core/tools/mail.js +51 -0
  31. package/src/core/tools/mail.ts +52 -0
  32. package/src/core/tools/reach.js +51 -0
  33. package/src/core/tools/reach.ts +52 -0
  34. package/src/core/tools/vps.js +51 -0
  35. package/src/core/tools/vps.ts +52 -0
  36. package/src/core/tools/wordpress.js +51 -0
  37. package/src/core/tools/wordpress.ts +52 -0
  38. package/src/servers/agency-hosting.js +1 -1
  39. package/src/servers/agency-hosting.ts +1 -1
  40. package/src/servers/agent-readiness.js +1 -1
  41. package/src/servers/agent-readiness.ts +1 -1
  42. package/src/servers/all.js +1 -1
  43. package/src/servers/all.ts +1 -1
  44. package/src/servers/billing.js +1 -1
  45. package/src/servers/billing.ts +1 -1
  46. package/src/servers/dns.js +1 -1
  47. package/src/servers/dns.ts +1 -1
  48. package/src/servers/domains.js +1 -1
  49. package/src/servers/domains.ts +1 -1
  50. package/src/servers/ecommerce.js +1 -1
  51. package/src/servers/ecommerce.ts +1 -1
  52. package/src/servers/horizons.js +1 -1
  53. package/src/servers/horizons.ts +1 -1
  54. package/src/servers/hosting.js +1 -1
  55. package/src/servers/hosting.ts +1 -1
  56. package/src/servers/mail.js +1 -1
  57. package/src/servers/mail.ts +1 -1
  58. package/src/servers/reach.js +1 -1
  59. package/src/servers/reach.ts +1 -1
  60. package/src/servers/vps.js +1 -1
  61. package/src/servers/vps.ts +1 -1
  62. package/src/servers/wordpress.js +1 -1
  63. package/src/servers/wordpress.ts +1 -1
  64. package/types.d.ts +25 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@ Generated at release time from the diff between the previous and current
4
4
  build. Tool changes are listed individually; everything else is summarised
5
5
  by area.
6
6
 
7
+ ## v3.20.0 — 2026-10-28
8
+
9
+ ### Operations
10
+
11
+ - Added `changelog_list-entries` — List changelog and roadmap entries (what's new, what's coming)
12
+
13
+ ### Also in this release
14
+
15
+ - Documentation: `README.md`
16
+ - Server instructions: 4 files
17
+ - Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
18
+ - Build and packaging: `types.d.ts`
19
+
7
20
  ## v3.19.2 — 2026-10-28
8
21
 
9
22
  ### 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 (412 total)
73
- - `hostinger-agency-hosting-mcp` — 42 operations for agency-hosting
74
- - `hostinger-agent-readiness-mcp` — 3 operations for agent-readiness
75
- - `hostinger-billing-mcp` — 9 operations for billing
76
- - `hostinger-dns-mcp` — 8 operations for dns
77
- - `hostinger-domains-mcp` — 42 operations for domains
78
- - `hostinger-ecommerce-mcp` — 29 operations for ecommerce
79
- - `hostinger-horizons-mcp` — 6 operations for horizons
80
- - `hostinger-hosting-mcp` — 61 operations for hosting
81
- - `hostinger-mail-mcp` — 38 operations for mail
82
- - `hostinger-reach-mcp` — 70 operations for reach
83
- - `hostinger-vps-mcp` — 67 operations for vps
84
- - `hostinger-wordpress-mcp` — 40 operations for wordpress
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hostinger-api-mcp",
3
- "version": "3.19.2",
3
+ "version": "3.20.0",
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.19.2",
3
+ "version": "3.20.0",
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.19.2",
9
+ "version": "3.20.0",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@hostinger/mcp",
14
- "version": "3.19.2",
14
+ "version": "3.20.0",
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;
@@ -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";
@@ -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;
@@ -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
  */
@@ -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;
@@ -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",
@@ -9,6 +9,7 @@ export interface OpenApiTool extends Tool {
9
9
  hidden?: boolean;
10
10
  replacesHidden?: boolean;
11
11
  group?: string;
12
+ everyServer?: boolean;
12
13
  topic?: string;
13
14
  handlerMethod?: string;
14
15
  templateFile?: string;
@@ -16,6 +17,57 @@ export interface OpenApiTool extends Tool {
16
17
  }
17
18
 
18
19
  const tools: OpenApiTool[] = [
20
+ {
21
+ "name": "changelog_list-entries",
22
+ "title": "List changelog and roadmap entries (what's new, what's coming)",
23
+ "annotations": {
24
+ "title": "List changelog and roadmap entries (what's new, what's coming)",
25
+ "readOnlyHint": true,
26
+ "destructiveHint": false
27
+ },
28
+ "topic": "common",
29
+ "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.",
30
+ "method": "",
31
+ "path": "",
32
+ "inputSchema": {
33
+ "type": "object",
34
+ "properties": {
35
+ "status": {
36
+ "type": "string",
37
+ "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.",
38
+ "enum": [
39
+ "released",
40
+ "upcoming",
41
+ "all"
42
+ ],
43
+ "default": "released"
44
+ },
45
+ "product": {
46
+ "type": "string",
47
+ "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."
48
+ },
49
+ "since": {
50
+ "type": "string",
51
+ "format": "date",
52
+ "description": "Only released entries dated on or after this date, as YYYY-MM-DD. Upcoming items are not filtered by date."
53
+ },
54
+ "limit": {
55
+ "type": "integer",
56
+ "description": "Most entries to return",
57
+ "minimum": 1,
58
+ "maximum": 100,
59
+ "default": 20
60
+ }
61
+ },
62
+ "required": []
63
+ },
64
+ "security": [],
65
+ "custom": true,
66
+ "templateFile": "list-changelog-entries.template.js",
67
+ "templateFileTS": "list-changelog-entries.template.ts",
68
+ "handlerMethod": "handleChangelogListEntries",
69
+ "everyServer": true
70
+ },
19
71
  {
20
72
  "name": "agency-hosting_deploy-node-static-website",
21
73
  "title": "Deploy node-static website",