Handsome Hosting
Server Details
Deploy sites and apps from your AI coding agent: domains, DNS, logs, env, versions and rollback.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 43 tools
Most tools target distinct resources, but several boundaries blur: create_project with serviceId duplicates deploy, create_project and create_wordpress both order sites, and the numerous *_status tools require careful resource matching. Descriptions usually clarify the intended use, so misselection is possible but often recoverable.
Names are consistently snake_case with useful prefixes such as wp_, tls_, list_, and request_, but the convention is mixed: many are verb_noun, others are noun_status or bare verbs like deploy, restart, resize, rollback, and logs. It remains readable, but the pattern is not predictable enough for a top score.
With 43 tools, the surface is heavy for a single MCP server even though the hosting domain is broad. Many tools are justified individually, but the total set is over-scoped and raises selection burden.
Coverage is extensive across services, deploys, domains, DNS, TLS, mail, backups, environment variables, approvals, and WordPress lifecycle operations. Minor gaps remain, such as domain deletion/transfer and direct service deletion only through approvals, but core workflows have no major dead ends.
Publisher details
- Operator
- Handsome Hosting · Publisher source
- Operator website
- https://hosting.handsome.co.il
- Vendor relationship
- First-party
- Documentation
- https://hosting.handsome.co.il/connect.md
- Trust center
- Not available
- Restrictions
- Requires a Handsome Hosting account with a confirmed email address. Servers and domains are paid services; any action that costs money or cannot be undone waits for an approval link mailed to the account owner.
Available Tools
43 toolsaction_statusApproval statusARead-onlyInspect
The state of an approval by actionId: pending, approved, done, declined, expired or failed, with the decision time, the error if any and a note on what to do next. Or a client link by inviteId (from a new project ordered with payer client): sent, claimed, paid, live, cancelled or expired, with the service once it exists, the person's monthly share and a note on what to do next.
Inputs: actionId, inviteId. Returns: ok, data, error
attach_domainAttach a domainADestructiveInspect
Point a domain bought here at a running, deployed service: the DNS zone is created or moved to the service address, the platform attaches the name and issues the certificate within about half an hour. Runs on the call, no approval: it costs nothing, and the same call moves the name to another service (the old one stops serving it). A name still registering is not-ready; a service with no deploy yet is not-deployed; a connected domain (one owned at another registrar) moves from the dashboard instead. The names are the account's heldDomains (unattached) and the domains of its services.
Inputs: name (required), serviceId (required), wpSwitch. Returns: ok, data, error
backup_nowBack up nowADestructiveInspect
Take a backup point of a live WordPress site now, once a day (the website button included). Answers state done with the stamp, or running for a big site (it joins the backup points when it lands). Refusals: too-soon, busy, not-live, migration-open, deploy-open, failed.
Inputs: serviceId (required). Returns: ok, data, error
buy_domainBuy a domainADestructiveInspect
Mint an approval for the person to buy an available domain for a year, optionally attached to a running service. Mails the link and returns actionId and approveUrl; the click opens the website buy page prefilled with the name and the service, where the person enters the registrant details and pays. Nothing is registered or charged here; the approval reads done once paid.
Inputs: name (required), serviceId. Returns: ok, data, error
connect_domainConnect a domainBDestructiveInspect
Connect a domain the person already owns at another registrar to a running service. method a-record (default) returns the two A records to set; method nameservers creates a zone here and returns our nameservers. Returns the steps and per-registrar guides for the person; the platform verifies every few minutes.
Inputs: name (required), serviceId (required), method, wpSwitch. Returns: ok, data, error
create_projectCreate a projectADestructiveInspect
Create and deploy a project. With serviceId: deploy into that existing service (the same as a deploy). Without serviceId: store the archive (the uploadId of an upload made without a serviceId, or archive as base64 under 1 MiB), analyse it, quote the cheapest server that fits, create the order and return actionId and approveUrl (also mailed to the person; one hour): the person opens it, sees the whole order (server, cost, card) and pays with one click; nothing is charged without that click. domain takes a name found available: the page offers it outside the total and the person adds it with one click (domainNote in the answer says when it could not be offered, or was offered before the registry answered). Once paid, the project deploys on the new server by itself. A partner account can instead have the client pay: payer client with clientEmail and secrets with a value for each secret the project declares; nothing is minted for the partner, the client gets a signup and payment link by mail and pays the regular price in their own account, and the answer carries inviteId. This fits only when the pre-flight needs list has a payer entry. An active partner with servers for client sites (services of kind host) can put the new site on one: hostId with the host's id puts it there for the site fee alone (the answer's mode is on-host and names the server's fit), hostId new buys a server of its own; left out, the site goes where the website's order form would put it. A full server refuses.
Inputs: name (required), payer, domain, hostId, +7 more. Returns: ok, data, error
create_wordpressOrder a WordPress siteADestructiveInspect
Order a WordPress site: a fresh install (mode new) or a server ready to receive an existing WordPress site (mode move). No upload and no pre-flight: the platform installs WordPress itself. Returns actionId and approveUrl (also mailed to the person; one hour): they see the order and pay with one click; nothing is charged without it. domain works as for a new project. Once paid, a new site installs and goes live by itself; a move server waits for the person to move the old site with the migration details. A partner account can instead have the client pay for a new site: payer client with clientEmail; the client gets a signup and payment link by mail and pays the regular price in their own account, and the answer carries inviteId. An active partner with servers for client sites (services of kind host) can put the new site on one: hostId with the host's id puts it there for the site fee alone (the answer's mode is on-host and names the server's fit), hostId new buys a server of its own; left out, the site goes where the website's order form would put it. A full server refuses.
Inputs: mode (required), name (required), payer, domain, +3 more. Returns: ok, data, error
deployDeployADestructiveInspect
Start a deploy into an existing running service: from an uploaded archive (uploadId, after its PUT), or archive as the base64 of a gzip tar for a tiny project under 1 MiB. Returns the deploy id; the deploy runs on its own. The service must already exist; a project with no server yet is ordered, not deployed.
Inputs: serviceId (required), archive, uploadId, preflight. Returns: ok, data, error
deploy_statusDeploy statusBRead-onlyInspect
The current deploy phase of a service with the live url, the plain-language reason if it failed and the launch checklist.
Inputs: serviceId (required). Returns: ok, data, error
dns_editEdit a DNS recordADestructiveInspect
One record change in a zone we serve, inside the website editor rails. op add needs record.type (A, AAAA, CNAME, MX, TXT, SRV, CAA), name (the subdomain, empty for the apex), target and optional ttl (default 300), priority (MX, SRV), weight, port, service, protocol (SRV), tag (CAA). op replace needs record.id plus the full record; op delete needs record.id. Managed records are refused; invalid-record carries the field and the reason.
Inputs: op (required), record (required), domainId (required). Returns: ok, data, error
domain_statusDomain statusBRead-onlyInspect
The stage of a domain (connecting, registered, attached, live, paid and so on), the website wording, which names resolve yet, when it was last checked, the next step in plain words and whether its DNS can be edited here.
Inputs: domainId (required). Returns: ok, data, error
form_mailForm mail endpointARead-onlyInspect
The form relay endpoint of an existing service, for a contact form on the site: the URL to POST to and the rules the form must follow (submit with fetch, the email and _gotcha fields, the success check, the limits). A new project's forms post to the same full address with the literal HH_FORM_TOKEN as the token; the site's own server does not answer a relative /f/ path.
Inputs: serviceId (required). Returns: ok, data, error
list_backupsList backupsARead-onlyInspect
The backup points on the server of a live WordPress site, newest first: stamp, time, kind (scheduled nightly, manual, pre-restore, pre-import) and the size of the database and files halves; a restore takes the stamp. older counts the points kept off the server, which the person brings back on the website first (olderNote). running names a backup or restore under way; nextManualAt is when a manual backup opens again.
Inputs: serviceId (required). Returns: ok, data, error
list_dnsList DNS recordsBRead-onlyInspect
The DNS records of a domain whose zone we serve (a purchased domain, or one connected by nameservers): id, type, host, target, ttl and the extra fields, with managed: true on the records the platform protects (NS, SOA, and the apex and www A while a service is attached). not-ours for a domain pointed at us by A records at another registrar.
Inputs: domainId (required). Returns: ok, data, error
list_envList environment variablesARead-onlyInspect
Names of the environment variables the project declares or has stored, with a flag for stored ones. Values are never returned.
Inputs: serviceId (required). Returns: ok, data, error
list_plansList plansARead-onlyInspect
The plans this running server can move to, as the website plan page lists them: larger ones always, smaller ones only when the current disk fits. Each line carries planId, label, size tier, disk, direction (up or down), chargeNowIls (the difference for the upcoming month or year, 0 for a move down) and recurringIls (the price after, per month or per year by the service cadence, see period), in ILS including VAT.
Inputs: serviceId (required). Returns: ok, data, error
list_servicesList servicesARead-onlyInspect
Every service on this account: id, name, kind, status, address, live url, plan, region, renewal date, the latest deploy and its domains; plus heldDomains, the names bought here that point at no service yet. wordpress is null for a code service, else its mode (new or move), whether the site is live and an open move. The starting point of a session: its ids are the serviceId and domainId values every other call takes.
Inputs: no named parameters. Returns: ok, data, error
list_versionsList versionsBRead-onlyInspect
Kept versions of a service, newest first, with their numbers and which one is live.
Inputs: serviceId (required). Returns: ok, data, error
logsRead logsARead-onlyInspect
The last lines of a log of a running service, scrubbed of visitor addresses. source defaults to the main log for the service kind; lines up to 500.
Inputs: serviceId (required), lines, filter, source. Returns: ok, data, error
mail_statusMail statusARead-onlyInspect
Mail through the platform gate for an app that sends its own mail: tier (0 = the owner only, 1 = any recipient), hourly and daily limits, whether sending is suspended, and how much went out in the last hour and day. A static site answers no-mailer: its forms use the form relay. A server with hosted mailboxes also lists them (address, and whether a password is set); passwords are set by the person on the mail page of the service and by no tool.
Inputs: serviceId (required). Returns: ok, data, error
preflightPre-flight checksBRead-onlyInspect
The pre-flight protocol for a project, before its first upload: the checks to run on the person's machine (build, render, console, bundle, accessibility), the report a new project or a deploy must carry, and the needs list (mail, domain, certificates, visitors, accessibility) with what the platform offers for each.
Inputs: signature. Returns: ok, data, error
redeployRedeployBDestructiveInspect
Run the latest archive through the deploy again (same files, fresh build).
Inputs: serviceId (required). Returns: ok, data, error
request_actionRequest an approvalADestructiveInspect
Mint an approval for a money or irreversible step. kind: cancel (renewal off, the service runs to the end of the paid period), cancel-now (off the air now), delete (remove a finished or failed project), restore (a backup point over the live WordPress site: backupStamp is its stamp; scope db, files or both, default both), root-reset (a bare server) or wp-reset (a moved WordPress site, or one whose move failed, back to a fresh WordPress; the site is copied first when one was live). Nothing changes until the person clicks the approval link, which is also mailed to them and expires after one hour. Returns actionId and approveUrl.
Inputs: kind (required), serviceId (required), scope, backupStamp. Returns: ok, data, error
request_mail_tierChange mail reachADestructiveInspect
Change who an app's mail may reach. tier 1 lets it mail anyone it collects addresses from (50 an hour, 200 a day): this returns an approval link mailed to the person. tier 0 goes back to the owner only and runs now. Refusals: no-mailer, suspended, already-there, already-pending.
Inputs: tier (required), serviceId (required). Returns: ok, data, error
request_uploadRequest an upload URLADestructiveInspect
A one-time PUT url for an archive: the first step of a deploy, a new project, or a WordPress plugin or theme upload. The archive is a gzip tar of the folder (tar -czf project.tgz -C .) sent with content-type application/gzip; the answer carries the exact curl command and the uploadId. With serviceId the upload belongs to that service; without it, to a new project. The url takes one file up to 25 MiB and expires after 15 minutes.
Inputs: serviceId. Returns: ok, data, error
resizeResize a serverADestructiveInspect
Move a running server to another plan by planId. A smaller plan is applied on this call (no charge, no refund; the machine reboots, usually within minutes). A larger plan needs the person: this mints an upsize approval, mails the link and returns actionId and approveUrl; the click charges the difference on their saved card (or opens the payment page) and the resize starts.
Inputs: planId (required), serviceId (required). Returns: ok, data, error
restartRestart a serviceADestructiveInspect
Restart the service process: the site unit on a shared host, the whole box on a managed server. Refused while a deploy is in progress.
Inputs: serviceId (required). Returns: ok, data, error
rollbackRoll back to a versionADestructiveInspect
Put an earlier version live again: the previous one by default, or a specific version number. Starts a deploy, which runs on its own.
Inputs: serviceId (required), version. Returns: ok, data, error
search_domainSearch a domainARead-onlyInspect
Availability and yearly price in ILS (VAT included) for a domain: a bare label checks .co.il and .com, a full name checks that one. availability is available, taken, premium, invalid or unknown (the registry did not answer within 25 seconds; a later search may answer). Costs write points: the registry is slow.
Inputs: query (required). Returns: ok, data, error
set_envSet environment variablesADestructiveInspect
Store one or more environment values by name and reload the service. A name is accepted when the deployed handsome.json declares it (secrets: [{ name, label }]) or a value is already stored. Values are never echoed back.
Inputs: values (required), serviceId (required). Returns: ok, data, error
set_form_recipientsSet form recipientsADestructiveInspect
Set where a site's form messages go: 1 to 5 email addresses, all in one message, or reset: true for the account address. Not for WordPress, which sends its own form mail.
Inputs: serviceId (required), to, reset. Returns: ok, data, error
site_document_templateSite document templateARead-onlyInspect
The Hebrew privacy policy or accessibility statement a business site needs under Israeli law, as a template: every section in and every answer a {{name}} blank, the fields, each with its question for the person and what we already know (pass serviceId for a site that exists), and the rules for building the page into the site.
Inputs: doc (required), serviceId. Returns: ok, data, error
tls_reissueReissue a certificateADestructiveInspect
Renew the certificate of one served name now (no money, runs on the call): only on a running server with no deploy in progress, at most once every 34 hours per name (the certificate issuer allows five a week, and a reissue deletes the old one first), never for a custom certificate the person uploaded. Refusals: not-served, custom, deploy-open, too-soon, reissue-failed.
Inputs: name (required), serviceId (required). Returns: ok, data, error
tls_statusCertificate statusARead-onlyInspect
Certificates of a service: every name it serves (the app address and each connected domain) with mode (auto or custom), valid-to, days left, the last reissue and until when a reissue is blocked. Certificates renew on their own.
Inputs: serviceId (required). Returns: ok, data, error
wp_app_passwordWordPress application passwordADestructiveInspect
Create a WordPress application password for the site's administrator, for the site's own REST API (posts, pages, media): the answer carries the user, the password (shown once, never stored by the platform) and the REST address; a second create replaces this connection's earlier password. Revoke removes the passwords this connection created and no others; revoking the key on the account page removes them too. Refusals: not-live, migration-open, deploy-open, busy, failed.
Inputs: action (required), serviceId (required). Returns: ok, data, error
wp_cache_purgePurge the WordPress cacheADestructiveInspect
Empty the page cache and the object cache of a live WordPress site, so the next visit shows the current content. Refusals: not-live, migration-open, deploy-open, busy, failed.
Inputs: serviceId (required). Returns: ok, data, error
wp_core_updateUpdate WordPress coreADestructiveInspect
Update WordPress itself to the latest version and upgrade the database; can take a few minutes. The answer names the newest backup point (latestBackup), which a restore approval can put back. Refusals: not-live, migration-open, deploy-open, busy, failed.
Inputs: serviceId (required). Returns: ok, data, error
wp_loginWordPress admin login linkADestructiveInspect
A one-time link that signs the person into wp-admin of a live WordPress site as its administrator, for the person's own browser; it works once and expires in 4 minutes. Refusals: not-wordpress, not-live.
Inputs: serviceId (required). Returns: ok, data, error
wp_migrationWordPress move detailsARead-onlyInspect
For a WordPress site ordered as a move: the plugin address, the migration key (until the old site first uses it, then masked), the steps the person takes on the old site, the state of an open move and movedAt once a move landed.
Inputs: serviceId (required). Returns: ok, data, error
wp_pluginManage a WordPress pluginADestructiveInspect
Install (from the WordPress.org directory; activate true switches it on too), activate, deactivate or update one plugin of a live WordPress site by its slug (the folder name: lowercase letters, digits and hyphens). Runs on the call. Deleting a plugin is not offered here: the person does it in wp-admin. The platform helper hh-migrate is not touched. Refusals: invalid-argument, not-a-target, not-live, migration-open, deploy-open, busy, failed (with WP-CLI's line).
Inputs: slug (required), action (required), serviceId (required), activate. Returns: ok, data, error
wp_statusWordPress statusARead-onlyInspect
A live WordPress site as WP-CLI reads it: the core version and the update on offer, every plugin and theme with its status, version and update on offer, the active theme, and the site and admin addresses. Refusals: not-wordpress, not-live, not-running.
Inputs: serviceId (required). Returns: ok, data, error
wp_themeManage a WordPress themeADestructiveInspect
Install (from the WordPress.org directory), activate or update one theme of a live WordPress site by its slug (the folder name). Runs on the call; switching away from a theme leaves it installed. Refusals: invalid-argument, not-live, migration-open, deploy-open, busy, failed.
Inputs: slug (required), action (required), serviceId (required). Returns: ok, data, error
wp_upload_extensionUpload a WordPress plugin or themeADestructiveInspect
Install the builder's own plugin or theme on a live WordPress site from an uploaded archive (the uploadId of an upload made with this serviceId, after its PUT). The archive is built from inside the plugin or theme folder (tar -czf extension.tgz -C .). A plugin needs a PHP file at the root with a Plugin Name: header, a theme a style.css with Theme Name:. A folder of the same slug is replaced. Refusals: invalid-argument, not-a-target, invalid-archive, too-large, not-live, migration-open, deploy-open, busy, failed.
Inputs: slug (required), type (required), uploadId (required), serviceId (required), +1 more. Returns: ok, data, error
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Deploy and manage your apps, databases, storage, and scheduled jobs from your AI agent
Deploy apps from GitHub, read build/runtime logs, and manage your app's users from your AI agent.
Deploy and run apps in your own AWS, Google Cloud, Azure or DigitalOcean account from any AI agent.
Deploy local apps, add managed Postgres, and inspect logs from your AI coding agent.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI clients and users to deploy static sites, Node.js services, and Python web applications without Docker, with tools for project management, deployment, rollback, and domain configuration.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to build and deploy an app from a GitHub repository to a managed live server and then operate it — logs, captured errors, health checks, managed Postgres, secrets, custom domains, email authentication, and Stripe checkout links. It also exposes safe, read/write-labelled tools so agents can rebuild, start/stop, and inspect projects without ever editing source code.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI coding agents to check repository deploy readiness, deploy apps to your own cloud (AWS, Google Cloud, Azure, DigitalOcean), and migrate apps from platforms like Heroku, Railway, Render, or Vercel with rollback.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to deploy code to any hosting provider by creating PRs, building, and verifying health checks, all from a single natural language command.61 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.