Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "hostinger-connector",
"displayName": "Hostinger Connector",
"version": "0.3.1",
"version": "0.3.2",
"description": "MCP plugin to deploy and manage Hostinger websites, WordPress, domains, DNS, VPS, and subscriptions from inside Cursor.",
"author": "Hostinger",
"license": "MIT",
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## [0.3.2] - 2026-11-05

### Changed

- Synced with `@hostinger/mcp` 3.29.0: audit-hosting, connect-domain, deploy-to-hosting, hostinger-headless, migrate-to-hosting, operation catalog, troubleshoot-website

## [0.3.1] - 2026-10-02

### Changed
Expand Down
18 changes: 9 additions & 9 deletions mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,47 @@
"hostinger-hosting": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-hosting-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-wordpress": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-wordpress-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-agency-hosting": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-agency-hosting-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-domains": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-domains-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-dns": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-dns-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-billing": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-billing-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-reach": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-reach-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-ecommerce": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-ecommerce-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
},
"hostinger-vps": {
"command": "npx",
"args": ["--yes", "--package=@hostinger/mcp@latest", "hostinger-vps-mcp"],
"env": { "USER_AGENT": "plugin;cursor;0.3.1" }
"env": { "USER_AGENT": "plugin;cursor;0.3.2" }
}
}
}
2 changes: 2 additions & 0 deletions scripts/check-tool-names.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ const NON_TOOL_IDENTIFIERS = new Set([
"wp_options",
"wp-admin",
"siteurl",
"mail_sent",
"mail_failed",
]);

/** Ignore fenced code blocks: JSON examples and shell snippets aren't guidance. */
Expand Down
79 changes: 74 additions & 5 deletions scripts/mcp-tools.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"package": "@hostinger/mcp",
"version": "2.7.0",
"total": 403,
"version": "3.29.0",
"total": 468,
"groups": {
"agency-hosting": [
"agency-hosting_cache_clear-website",
Expand Down Expand Up @@ -45,7 +45,14 @@
"agency-hosting_websites_list-processes",
"agency-hosting_wordpress_change-version",
"agency-hosting_wordpress_list-versions",
"agency-hosting_wordpress_settings"
"agency-hosting_wordpress_settings",
"changelog_list-entries"
],
"agent-readiness": [
"agent-readiness_checks_list",
"agent-readiness_scans_get",
"agent-readiness_scans_run",
"changelog_list-entries"
],
"billing": [
"billing_catalog_list",
Expand All @@ -56,9 +63,11 @@
"billing_subscriptions_disable-auto-renewal",
"billing_subscriptions_enable-auto-renewal",
"billing_subscriptions_list",
"billing_subscriptions_renew"
"billing_subscriptions_renew",
"changelog_list-entries"
],
"dns": [
"changelog_list-entries",
"dns_records_delete",
"dns_records_list",
"dns_records_reset",
Expand All @@ -69,6 +78,7 @@
"dns_snapshots_restore"
],
"domains": [
"changelog_list-entries",
"domains_availability_check",
"domains_availability_suggest-names-from",
"domains_availability_suggest-names-from-description",
Expand Down Expand Up @@ -113,6 +123,7 @@
"domains_whois_usage"
],
"ecommerce": [
"changelog_list-entries",
"ecommerce_discounts_create",
"ecommerce_discounts_list",
"ecommerce_miscellaneous_custom-storefront-setup-instructions",
Expand Down Expand Up @@ -143,7 +154,15 @@
"ecommerce_stores_list",
"ecommerce_stores_metadata"
],
"gpu": [
"changelog_list-entries",
"gpu_catalog_pool",
"gpu_catalog_pool-groups",
"gpu_catalog_pool-instance-types",
"gpu_catalog_pool-os-templates"
],
"horizons": [
"changelog_list-entries",
"horizons_websites_clone",
"horizons_websites_create",
"horizons_websites_edit",
Expand All @@ -152,9 +171,16 @@
"horizons_websites_publish"
],
"hosting": [
"changelog_list-entries",
"hosting_cache_clear",
"hosting_cache_clear-website",
"hosting_cache_status",
"hosting_cache_toggle-cacheless",
"hosting_cache_toggle-website",
"hosting_cdn_disable",
"hosting_cdn_enable",
"hosting_cdn_purge-cache",
"hosting_cdn_status",
"hosting_cron-jobs_create",
"hosting_cron-jobs_delete",
"hosting_cron-jobs_list",
Expand All @@ -170,6 +196,7 @@
"hosting_databases_repair",
"hosting_databases_setup-website",
"hosting_datacenters_list",
"hosting_deploy",
"hosting_deploy-js-application",
"hosting_deploy-static-website",
"hosting_deploy-wordpress-plugin",
Expand All @@ -185,18 +212,25 @@
"hosting_files_generate-upload-url",
"hosting_files_list-website-and-directories",
"hosting_files_website-content",
"hosting_get-deployment",
"hosting_git_auto-deployment-settings",
"hosting_git_delete-auto-deployment-settings",
"hosting_git_deploy-website-repository",
"hosting_git_generate-ssh-key",
"hosting_git_list-installation-repositories",
"hosting_git_list-installations",
"hosting_git_list-website-repositories",
"hosting_git_ssh-public-key",
"hosting_git_update-auto-deployment-settings",
"hosting_headless_submit-build-report",
"hosting_import-wordpress-website",
"hosting_list-js-deployments",
"hosting_nodejs_analyse-failed-build",
"hosting_nodejs_build",
"hosting_nodejs_build-logs",
"hosting_nodejs_build-settings",
"hosting_nodejs_build-settings-from-archive",
"hosting_nodejs_build-settings-from-repository",
"hosting_nodejs_clear-runtime-logs",
"hosting_nodejs_list-builds",
"hosting_nodejs_list-environment-variables",
Expand All @@ -222,13 +256,22 @@
"hosting_ssl_status",
"hosting_ssl_toggle-https-redirect",
"hosting_ssl_uninstall",
"hosting_websites_add-domain",
"hosting_websites_create",
"hosting_websites_create-deprecated",
"hosting_websites_delete",
"hosting_websites_deploy-static-site-archive",
"hosting_websites_get-settings",
"hosting_websites_list",
"hosting_websites_list-setups"
"hosting_websites_list-domains",
"hosting_websites_list-setups",
"hosting_websites_remove-domain",
"hosting_websites_start-setup",
"hosting_websites_trigger-event",
"hosting_websites_update-settings"
],
"mail": [
"changelog_list-entries",
"mail_aliases_create-alias",
"mail_aliases_delete-alias",
"mail_aliases_list",
Expand Down Expand Up @@ -269,6 +312,7 @@
"mail_webhooks_update"
],
"reach": [
"changelog_list-entries",
"reach_automations_get",
"reach_automations_list",
"reach_automations_list-steps",
Expand All @@ -290,14 +334,31 @@
"reach_contacts_list-groups",
"reach_contacts_list-profile",
"reach_contacts_update",
"reach_forms_add-submitter-tags",
"reach_forms_create",
"reach_forms_delete",
"reach_forms_duplicate",
"reach_forms_get",
"reach_forms_list",
"reach_forms_remove-submitter-tag",
"reach_forms_update",
"reach_forms_update-template",
"reach_integrations_connect-ai-website-builder-site",
"reach_integrations_connect-ecommerce-store",
"reach_integrations_disconnect-ai-website-builder-site",
"reach_integrations_disconnect-ecommerce-store",
"reach_integrations_disconnect-wordpress-site",
"reach_integrations_list-connected-websites",
"reach_integrations_list-ecommerce-stores",
"reach_profiles_connect-sending-domain",
"reach_profiles_connected-sending-domain",
"reach_profiles_delete-sending-domain",
"reach_profiles_domain-dns-status",
"reach_profiles_list",
"reach_profiles_list-plan-feature-access",
"reach_profiles_remaining-plan-limits",
"reach_profiles_settings",
"reach_profiles_update-settings",
"reach_segments_count-profile-contacts",
"reach_segments_create",
"reach_segments_create-profile",
Expand All @@ -320,9 +381,11 @@
"reach_tags_remove-contacts-from",
"reach_tags_rename",
"reach_templates_create-email",
"reach_templates_email",
"reach_templates_list-email"
],
"vps": [
"changelog_list-entries",
"vps_actions_get",
"vps_actions_list",
"vps_backups_list",
Expand Down Expand Up @@ -370,6 +433,9 @@
"vps_snapshots_delete",
"vps_snapshots_get",
"vps_snapshots_restore",
"vps_ssh-keys_add-virtual-machine",
"vps_ssh-keys_list-virtual-machine",
"vps_ssh-keys_remove-virtual-machine",
"vps_templates_get",
"vps_templates_list",
"vps_virtual-machines_attached-public-keys",
Expand All @@ -389,6 +455,9 @@
"vps_virtual-machines_stop"
],
"wordpress": [
"changelog_list-entries",
"wordpress_ai-content_generate-images",
"wordpress_ai-content_generation-result",
"wordpress_ai-tools_set-option-status",
"wordpress_ai-tools_show-option-status",
"wordpress_installations_check-if-are-valid",
Expand Down
4 changes: 2 additions & 2 deletions skills/audit-hosting/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ Tell the user the size (plans, websites, WordPress installs) before the checks.

Per Shared and Cloud website (skip `builder` and `horizons`):

- `hosting_ssl_status` — flag `failed` (with `last_error`), `expired`, `not_installed` on a custom domain, `is_https_redirect_enabled: false`, and `expires_at` within 30 days when `is_lifetime` is false. Lifetime certificates renew on their own.
- Node.js sites: `hosting_nodejs_list-builds` with `per_page: 1` (latest build failed?) and `hosting_nodejs_list-vulnerabilities` with `severities: ["critical", "high"]`.
- `hosting_websites_get-settings` — in `ssl`, flag `failed` (with `last_error`), `expired`, `not_installed` on a custom domain, `is_https_redirect_enabled: false`, and `expires_at` within 30 days when `is_lifetime` is false; lifetime certificates renew on their own. In `cache`, flag `is_cacheless_mode_enabled: true` (development mode left on) and `is_enabled: false`.
- Node.js sites: `hosting_get-deployment` (latest build failed? `build.state`) and `hosting_nodejs_list-vulnerabilities` with `severities: ["critical", "high"]`.

Per hosting account (`username`): `hosting_databases_list` — flag `disk_usage_mb` above 80% of `max_size_mb`.

Expand Down
14 changes: 7 additions & 7 deletions skills/connect-domain/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ dig +short MX DOMAIN; dig +short TXT DOMAIN; dig +short CAA DOMAIN

Shared and Cloud:

- **New website on the domain.** For a domain outside this account run `hosting_domains_verify-ownership` first. When `is_accessible` is false, give the user the `TXT` record it returns to add next to the existing ones, then verify again (propagation takes up to ~10 minutes). Create with `hosting_websites_create` (`domain` without `www.`, `order_id`), then poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed`.
- **Moving a site off its free subdomain.** Shared and Cloud websites cannot be renamed through the API. Either create a website on the real domain and redeploy the project there (the `deploy-to-hosting` skill) — required for WordPress, which keeps its URL in the database — or, for static sites, park the domain on the existing site with `hosting_domains_create-website-parked`.
- **Alias** (a second domain showing the same site): `hosting_domains_create-website-parked`.
- **Subdomain** (`shop.example.com`): `hosting_domains_create-website-subdomain`. `www` belongs to the main domain — do not create it as a subdomain.
- **New website on the domain.** For a domain outside this account run `hosting_domains_verify-ownership` first. When `is_accessible` is false, give the user the `TXT` record it returns to add next to the existing ones, then verify again (propagation takes up to ~10 minutes). Create with `hosting_websites_create` (`order_id`, `domain` without `www.`), then poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed`.
- **Moving a site off its free subdomain.** Shared and Cloud websites cannot be renamed through the API. Either create a website on the real domain and redeploy the project there (the `deploy-to-hosting` skill) — required for WordPress, which keeps its URL in the database — or, for static sites, park the domain on the existing site with `hosting_websites_add-domain` (`type: "parked"`).
- **Alias** (a second domain showing the same site): `hosting_websites_add-domain` with `type: "parked"`.
- **Subdomain** (`shop.example.com`): `hosting_websites_add-domain` with `type: "subdomain"`. `www` belongs to the main domain — do not create it as a subdomain.

Agency Plan:

Expand All @@ -40,20 +40,20 @@ Agency Plan:

## 3. Point DNS at Hostinger

**DNS already at Hostinger** (nameservers end in `dns-parking.com`): creating the website normally writes the records. Read the zone with `dns_records_list`; when `@` and `www` already point at the site, change nothing. Before any edit, note the newest `dns_snapshots_list` entry — `dns_snapshots_restore` rolls back to it.
**DNS already at Hostinger** (nameservers end in `dns-parking.com`): keep the domain's existing `*.dns-parking.com` nameserver pair and do not change its nameservers. Creating the website normally writes the records. Read the zone with `dns_records_list`; when `@` and `www` already point at the site, change nothing. Before any edit, note the newest `dns_snapshots_list` entry — `dns_snapshots_restore` rolls back to it.

`dns_records_update` defaults to `overwrite: true`, which deletes every existing record with the same name and type. Adding a `TXT` at `@` that way wipes SPF and verification records. Send `overwrite: false` when adding; use `true` only to replace one record set on purpose, and run `dns_records_validate` on the same payload first.

**DNS elsewhere** (registered at Hostinger with other nameservers, or registered elsewhere). Two options — let the user choose:

- **Switch nameservers to Hostinger.** Hostinger then manages every record. First copy each record the current DNS serves beyond the website — `MX`, `TXT`, service `CNAME`s — into the Hostinger zone with `dns_records_update` (`overwrite: false`); otherwise email breaks when the nameservers flip. Hostinger's nameserver pairs differ between domains (`ns1`/`ns2.dns-parking.com`, `solar`/`lunar.dns-parking.com` and others), so use the pair hPanel shows for this domain, never a guessed one. For Hostinger-registered domains apply it with `domains_portfolio_update-nameservers`; otherwise the user changes it at their registrar.
- **Switch nameservers to Hostinger.** Hostinger then manages every record. First copy each record the current DNS serves beyond the website — `MX`, `TXT`, service `CNAME`s — into the Hostinger zone with `dns_records_update` (`overwrite: false`); otherwise email breaks when the nameservers flip. Hostinger's nameserver pairs differ between domains, and DNS resolves only on the pair the domain belongs to. Use the pair hPanel shows for the domain (Nameservers page → "Use Hostinger nameservers"), or ask the user for it. Never guess nameservers, and never use `ns1`/`ns2.dns-parking.com`. For Hostinger-registered domains apply it with `domains_portfolio_update-nameservers`; otherwise the user changes it at their registrar.
- **Keep the current DNS provider** and change only the web records: `A` for `@` and `CNAME` (or `A`) for `www`. Agency sites point at `details.ipv4`. Shared and Cloud sites point at the targets in the Hostinger zone for the domain (`dns_records_list`) or, when that zone does not exist, the IP hPanel shows for the website. The user makes this change at their DNS provider.

## 4. SSL and HTTPS

Start only once `dig` shows the domain resolving to Hostinger — the certificate authority checks the domain against the server.

- Shared and Cloud: `hosting_ssl_status`. When it is not `active`, call `hosting_ssl_install` and poll the status until `active` (or `failed` with `last_error`), then `hosting_ssl_toggle-https-redirect` with `is_enabled: true` (it returns 422 until a certificate exists).
- Shared and Cloud: `ssl` in `hosting_websites_get-settings`. When `ssl.status` is not `active`, call `hosting_ssl_install` and poll `hosting_websites_get-settings` until it is `active` (or `failed` with `last_error`), then `hosting_websites_update-settings` with `httpsRedirect: true` (it changes nothing until the certificate is `active`).
- Agency: `agency-hosting_ssl_install-website` for each domain, then poll `agency-hosting_ssl_website-status`. A domain allows three setups per seven days and one request a minute — install once DNS is right and never loop.
- A `CAA` record at the apex that does not allow `letsencrypt.org` blocks issuance; the user adds `0 issue "letsencrypt.org"` beside the existing ones.

Expand Down
Loading
Loading