zone-mcp
zone-mcp is an MCP server for managing Zone.ee / Zone.eu hosting through the ZoneID API v2, with dedicated tools plus a generic API request tool.
List/get domains, nameservers, expiry, DNSSEC, autorenew and delegation details.
List webhostings and get server info such as IPs, paths, hostnames and phpMyAdmin URL.
List, create, update and delete DNS records of many types, with optional confirmation before writes.
List mailboxes and manage mail forwarders/aliases.
List MySQL databases/users, cron jobs and SSL certificates; private keys are never returned.
Inspect SSH access and read filtered Apache/PHP/PM2 logs over SSH without uploading keys.
Search and describe bundled OpenAPI endpoints.
Call any ZoneID API endpoint via
zone_api_request, including mailbox, MySQL, cron, SSH key, FTP, Redis, PM2, cloud VPS and billing/order operations, with confirmation for writes and some paid operations.
Provides tools to list and manage MySQL databases and database users on a Zone webhosting account, with additional MySQL operations available through the generic ZoneID API request tool.
Allows managing PM2 process manager resources on Zone hosting through the generic ZoneID API request tool.
Allows managing Redis resources on Zone hosting through the generic ZoneID API request tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zone-mcp show the MX and TXT records for example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
zone-mcp
An MCP server for Zone.ee / Zone.eu hosting, built on the ZoneID API v2. Use it from Claude or any other MCP client to manage domains, DNS records, mail forwarders and webhosting. A generic, spec-aware request tool covers the rest of the API: mailboxes, MySQL, cron, SSH, FTP, Redis, PM2 and cloud VPS.
Built on the MCP TypeScript SDK v2 (
@modelcontextprotocol/server). It serves the 2026-07-28 protocol revision and still works with clients on the 2025 revisions.Uses the stdio transport. It needs Node.js 20 or newer.
Tools
Tool | What it does |
| Domains on the account (filters, sorting, paging), or one domain with its nameservers |
| Webhosting packages and their usage, or a server's IPs, paths and hostnames |
| Records of one type, or of every type, optionally filtered by name |
| Manage A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, TLSA, SSHFP and URL records |
| Mailboxes and forwarders on a webhosting |
| Manage forwarders (aliases) |
| MySQL databases and database users |
| Cron jobs and SSL certificates. Private keys are never returned |
| SSH user, server IP, access mode, whitelisted IPs, registered keys vs. your local keys, and a test login, with |
| Newest lines of a webhosting's Apache access/error, PHP or PM2 logs over SSH, filtered on the server by host, HTTP status and text, optionally including rotated days |
| Search the bundled OpenAPI spec, and show an endpoint's parameters and body fields |
| Call any ZoneID API endpoint. POST, PUT and DELETE ask you to confirm first |
Related MCP server: infomaniak-mcp-agent
Setup
Create an API token at my.zone.eu → Settings → Security → API keys. It is shown only once.
Give the server your ZoneID username and token. Use either option below.
Option A: macOS Keychain (recommended on a Mac). The token never appears in a config file.
security add-generic-password -U -s zone-ee-api -a <your ZoneID username> -w
# paste the token at the prompt
claude mcp add -s user zone -- npx -y github:aanndryyyy/zone-mcpOption B: environment variables.
claude mcp add -s user zone -e ZONE_USERNAME=<username> -e ZONE_API_TOKEN=<token> -- npx -y github:aanndryyyy/zone-mcpClaude Desktop, Cursor, and other clients using mcpServers JSON
{
"mcpServers": {
"zone": {
"command": "npx",
"args": ["-y", "github:aanndryyyy/zone-mcp"],
"env": { "ZONE_USERNAME": "<username>", "ZONE_API_TOKEN": "<token>" }
}
}
}If you stored the credentials in the Keychain, leave out the env block.
From a local clone
git clone https://github.com/aanndryyyy/zone-mcp.git
cd zone-mcp && npm install # builds dist/ automatically
claude mcp add -s user zone -- node "$PWD/dist/index.js"Environment variables
Variable | Default | Purpose |
| – | ZoneID username |
| – | ZoneID API token |
|
| macOS Keychain service the server reads when the two variables above are not set |
|
| Override the API base URL |
| – | Private key file for the SSH tools (sets |
SSH tools
read_logs and get_ssh_access run your system ssh with your own keys; nothing is uploaded and no key is stored. They work on webhostings (shared and Privaatserver), not cloud VPS.
Host-key pinning. The server's host keys are fetched with
ssh-keyscanand accepted only when their SHA256 fingerprint matches the one the ZoneID API reports for that webhosting. They go into a temporary known_hosts file, removed on exit;~/.ssh/known_hostsis not touched.No shell injection. The remote side always runs a fixed script. Filter text reaches it base64-encoded and is matched literally (
grep -F).Read-only. Neither tool changes anything. To register a key or whitelist an IP,
get_ssh_accesspoints to thezone_api_requestcalls, which ask you to confirm. It never suggests switching SSH access frompublictowhiteliston its own, because that would lock out keys that connect from changing IPs, such as CI deploy keys.Untrusted output. Log lines contain whatever visitors and bots sent (URLs, user agents). Treat them as data, not instructions.
Example prompts
"Show the last 50 5xx errors on shop.example.com from the past three days."
"Why can't I SSH into example.com?"
"Which of my domains expire in the next 30 days?"
"Show the MX and TXT records for example.com."
"Add a TXT record
_acme-challenge.example.comwith valueabc123.""Point www.example.com at 192.0.2.10."
"Forward info@example.com to me@example.org."
"Create a daily 03:00 cron job on example.com that runs
php artisan schedule:run." (This one usesdescribe_endpoint, thenzone_api_request.)
Notes
Confirmation before writes. If your client supports form elicitation, the server asks you to confirm before it runs
update_*,delete_*, or a POST, PUT or DELETE throughzone_api_request. The prompt shows the old and new values, or the method, path and body. If you decline, nothing is sent and the tool returnsstatus: "declined"(or"cancelled"if you dismissed the prompt). The confirmation is bound to the exact arguments with a signedrequestState, so a client cannot answer it in advance or reuse it for other arguments. Clients without form elicitation skip this step and rely on their own tool-approval prompt. Create tools rely on the client's own tool approval.DNS names are FQDNs. Zone stores record names as
www.example.com. The DNS tools accept@, a bare label (www), or the FQDN, and convert it.update_dns_recordchanges only the fields you pass.Not available through the API: DNS TTLs (Zone manages them) and DNSSEC activation. Use my.zone.eu for these.
Rate limit. The API allows 60 requests/min per IP.
list_dns_recordswithouttypeuses 11 requests, one per record type. A429comes back as a tool error.Paid operations. Some endpoints reachable through
zone_api_requestcost money, for example/order/domain/renew,/order/cloudand billing resources.Structured output. Every tool declares an
outputSchemaand returnsstructuredContent, with the same JSON as text. The API always returns arrays, so list tools return objects such as{ domains, pager }.resource_urland_linksare removed to save tokens.Path safety.
zone_api_requestaccepts only paths underhttps://api.zone.eu/v2and does not follow redirects, so your credentials are never sent to another host.The OpenAPI spec in
spec/openapi.jsonis Zone's public API reference, bundled so the server can work offline.
Development
npm install
npm run build
npx @modelcontextprotocol/inspector node dist/index.js # interactive testing
# End-to-end smoke test against your live account. It's read-only: the only write is a DELETE of a record id that
# doesn't exist. It uses about 30 requests, so wait a minute between runs.
npm test # 2026-07-28 protocol
PROTOCOL=legacy npm test # 2025-era protocolLicense
MIT. Not affiliated with Zone Media OÜ.
Available Tools
19 toolscreate_dns_recordCreate DNS recordB
Create a DNS record. name may be '@' (zone apex), a label like 'www', or the FQDN; it is sent to Zone as an FQDN. Type-specific fields: MX priority; SRV priority, weight and port; CAA flag and tag; TLSA certificate_usage, selector and matching_type; SSHFP algorithm and fingerprint_type; URL redirect_type. TTL can't be set through the API.
Inputs: name (required), type (required), zone (required), destination (required), +11 more. Returns: record
create_mail_forwarderCreate mail forwarderB
Create an e-mail forwarder (alias) that forwards address to one or more destination addresses.
Inputs: address (required), vserver (required), fwd_addresses (required), comment. Returns: mail_forwarder
delete_dns_recordDelete DNS recordADestructiveIdempotent
Delete a DNS record by id (from list_dns_records). When the client supports it, the user is asked to confirm first; if they decline, nothing is deleted and the result has status 'declined' (or 'cancelled').
Inputs: id (required), type (required), zone (required). Returns: id, type, zone, record, +2 more
delete_mail_forwarderDelete mail forwarderADestructiveIdempotent
Delete an e-mail forwarder. When the client supports it, the user is asked to confirm first; if they decline, nothing is deleted and the result has status 'declined' (or 'cancelled').
Inputs: address (required), vserver (required). Returns: status, message, mail_forwarder
describe_endpointDescribe API endpointARead-only
Show the parameters, request-body fields and response fields of a ZoneID API endpoint from the official OpenAPI spec. path may be a template ('/vserver/{service_name}/crontab') or a concrete path ('/vserver/example.com/crontab').
Inputs: path (required), method. Returns: path, methods
find_endpointsFind API endpointsARead-only
Search the ZoneID API v2 reference for endpoints whose path, tag or summary contains every word of query (e.g. 'redis', 'mail autoreply', 'cloud resize'). Omit query to list all endpoints. Use describe_endpoint for the parameters and body fields, then zone_api_request to call it.
Inputs: query. Returns: endpoints
get_domainGet domainARead-only
Get one domain's registration details (expiry, DNSSEC, autorenew, delegation) together with its nameservers.
Inputs: domain (required). Returns: domain, nameservers
get_server_infoGet webhosting server infoCRead-only
Server details for a webhosting: IPs, temporary domain, home and document-root paths, MySQL and loopback hostnames, system username, binary paths, phpMyAdmin URL.
Inputs: vserver (required). Returns: server_info
list_cron_jobsList cron jobsARead-only
List the cron jobs on a webhosting: schedule, command or URL, type (http/system), reporting and state.
Inputs: vserver (required). Returns: pager, cron_jobs
list_dns_recordsList DNS recordsARead-only
List DNS records in a zone. Pass type for one record type; omit it to fetch every type (one API request per type, 11 in total, against a limit of 60/min). Record names are FQDNs ('www.example.com'). Each record has an id (for update/delete) and modify / delete flags; records with delete: false are system-managed. TTL is managed by Zone and not exposed by the API.
Inputs: zone (required), name, type. Returns: zone, records
list_domainsList domainsARead-only
List the domains on the ZoneID account with expiry, DNSSEC, autorenew and delegation info. Paginated (see pager).
Inputs: name, page, limit, order_by, +3 more. Returns: pager, domains
list_mail_accountsList mailboxesARead-only
List the e-mail accounts (mailboxes) on a webhosting, with quota, spam level, forwards and 2FA state.
Inputs: vserver (required), page, limit, address. Returns: pager, mail_accounts
list_mail_forwardersList mail forwardersARead-only
List the e-mail forwarders (aliases) on a webhosting and where each one forwards to.
Inputs: vserver (required), page, limit, address. Returns: pager, mail_forwarders
list_mysqlList MySQL databases and usersBRead-only
List the MySQL databases and database users (with their allowed hosts) on a webhosting.
Inputs: vserver (required). Returns: accounts, databases
list_ssl_certificatesList SSL certificatesARead-only
List the SSL certificates on a webhosting, with their hosts and validity. The PEM certificate bodies are left out unless include_pem is true; private keys are never returned.
Inputs: vserver (required), include_pem. Returns: pager, certificates
list_webhostingsList webhostingsARead-only
List the webhosting packages (virtual servers) on the account: name, package, disk/memory usage and limits, home directory, MySQL host. The name is the vserver argument for the mail, MySQL, cron and SSL tools.
Inputs: page, limit. Returns: pager, webhostings
update_dns_recordUpdate DNS recordADestructiveIdempotent
Change an existing DNS record (find its id with list_dns_records). Only the fields you pass are changed. When the client supports it, the user is asked to confirm the old and new values first; if they decline, nothing changes and the result has status 'declined' (or 'cancelled').
Inputs: id (required), type (required), zone (required), tag, +12 more. Returns: id, type, zone, record, +2 more
update_mail_forwarderUpdate mail forwarderADestructiveIdempotent
Replace the destination list and/or comment of an e-mail forwarder. fwd_addresses replaces the whole list. When the client supports it, the user is asked to confirm first.
Inputs: address (required), vserver (required), comment, fwd_addresses. Returns: status, message, mail_forwarder
zone_api_requestCall the ZoneID APIADestructive
Call any ZoneID API v2 endpoint, for everything the dedicated tools don't cover (mailbox create/update, autoreplies, MySQL create, cron create, SSH keys, FTP users, Redis, PM2, cloud VPS, domain contacts and renewals…). path is relative to https://api.zone.eu/v2, e.g. '/vserver/example.com/crontab'. Look up the body fields with describe_endpoint first. Responses are always arrays. GET and OPTIONS run directly; for POST, PUT and DELETE the user is asked to confirm (when the client supports it), and the prompt shows the method, path and body. Some endpoints cost money (domain renewals, cloud orders, extra packages).
Inputs: path (required), method (required), body, page, +4 more. Returns: data, path, pager, method, +2 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Most tools target clearly distinct resources and actions (DNS CRUD, mail forwarder CRUD, read-only listings, API discovery/call). The only overlap is that zone_api_request can perform almost everything the dedicated tools do, but its fallback role is explicitly documented, so misselection risk is low.
Almost all tools follow a predictable snake_case verb_noun pattern such as list_domains, get_domain, create_dns_record, and update_mail_forwarder. The main minor deviation is zone_api_request, which is noun-oriented rather than verb_noun.
19 tools is slightly above the typical compact range, but the server covers several subdomains: DNS, domains, webhosting, mail, MySQL, cron, SSL, and generic API access. The count is reasonable for that breadth, though it is on the heavier side.
DNS records and mail forwarders have full lifecycle coverage, while several other resources are read-only through dedicated tools. The find/describe/zone_api_request trio provides a workable escape hatch for missing operations such as mailbox creation, MySQL creation, cron creation, and renewals, so there are no hard dead ends.
Maintenance
Related MCP Connectors
Uptime, SSL, DNS and domain monitoring you can talk to from Claude or any MCP client.
MCP server for DNSimple — domains, DNS zone records, availability, pricing and contacts.
Official Porkbun MCP server: domains, DNS, SSL, hosting and Cloudflare via the Porkbun API.
Manage hosts, redirects, SSL, and traffic analytics from Claude and other AI assistants.
Related MCP Servers
AlicenseAqualityBmaintenanceLets you use Claude Desktop, or any MCP Client, to use natural language to accomplish things on your Cloudflare account.21,454 npm4,451Apache 2.0- AlicenseBqualityCmaintenanceinfomaniak-mcp-agent lets Claude (or any MCP client) drive a real Infomaniak account end-to-end through 54 tools — web hosting, mail, kDrive, domains, DNS, DNSSEC, FTP/SSH users, AI catalogue and more. Every destructive operation goes through a strict two-phase commit (plan + single-use confirmation token) so the agent can never silently mutate your account. Open Source74113 npm8MIT
- AlicenseNot gradedqualityDmaintenanceEnables managing Illuminati Networks CDN zones, object storage, and account (including uploads, signed URLs, and balance) from any MCP client like Claude Desktop.MIT
- AlicenseAqualityDmaintenanceMCP server for managing and analyzing Cloudflare DNS — zones, records, analytics, and DNSSEC.141MIT