Skip to main content
Glama

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

list_domains / get_domain

Domains on the account (filters, sorting, paging), or one domain with its nameservers

list_webhostings / get_server_info

Webhosting packages and their usage, or a server's IPs, paths and hostnames

list_dns_records

Records of one type, or of every type, optionally filtered by name

create_dns_record / update_dns_record / delete_dns_record

Manage A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, TLSA, SSHFP and URL records

list_mail_accounts / list_mail_forwarders

Mailboxes and forwarders on a webhosting

create_mail_forwarder / update_mail_forwarder / delete_mail_forwarder

Manage forwarders (aliases)

list_mysql

MySQL databases and database users

list_cron_jobs / list_ssl_certificates

Cron jobs and SSL certificates. Private keys are never returned

get_ssh_access

SSH user, server IP, access mode, whitelisted IPs, registered keys vs. your local keys, and a test login, with next_steps when something is missing

read_logs

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

find_endpoints / describe_endpoint

Search the bundled OpenAPI spec, and show an endpoint's parameters and body fields

zone_api_request

Call any ZoneID API endpoint. POST, PUT and DELETE ask you to confirm first

Related MCP server: infomaniak-mcp-agent

Setup

  1. Create an API token at my.zone.eu → Settings → Security → API keys. It is shown only once.

  2. 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-mcp

Option B: environment variables.

claude mcp add -s user zone -e ZONE_USERNAME=<username> -e ZONE_API_TOKEN=<token> -- npx -y github:aanndryyyy/zone-mcp

Claude 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

ZONE_USERNAME

–

ZoneID username

ZONE_API_TOKEN

–

ZoneID API token

ZONE_KEYCHAIN_SERVICE

zone-ee-api

macOS Keychain service the server reads when the two variables above are not set

ZONE_API_URL

https://api.zone.eu/v2

Override the API base URL

ZONE_SSH_KEY

–

Private key file for the SSH tools (sets IdentitiesOnly). Without it, ssh uses your agent, ~/.ssh/config and default keys

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-keyscan and 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_hosts is 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_access points to the zone_api_request calls, which ask you to confirm. It never suggests switching SSH access from public to whitelist on 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.com with value abc123."

  • "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 uses describe_endpoint, then zone_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 through zone_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 returns status: "declined" (or "cancelled" if you dismissed the prompt). The confirmation is bound to the exact arguments with a signed requestState, 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_record changes 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_records without type uses 11 requests, one per record type. A 429 comes back as a tool error.

  • Paid operations. Some endpoints reachable through zone_api_request cost money, for example /order/domain/renew, /order/cloud and billing resources.

  • Structured output. Every tool declares an outputSchema and returns structuredContent, with the same JSON as text. The API always returns arrays, so list tools return objects such as { domains, pager }. resource_url and _links are removed to save tokens.

  • Path safety. zone_api_request accepts only paths under https://api.zone.eu/v2 and does not follow redirects, so your credentials are never sent to another host.

  • The OpenAPI spec in spec/openapi.json is 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 protocol

License

MIT. Not affiliated with Zone Media OÜ.

Available Tools

19 tools
create_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 recordA
DestructiveIdempotent

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 forwarderA
DestructiveIdempotent

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 endpointA
Read-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 endpointsA
Read-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 domainA
Read-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 infoC
Read-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 jobsA
Read-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 recordsA
Read-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 domainsA
Read-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 mailboxesA
Read-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 forwardersA
Read-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 usersB
Read-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 certificatesA
Read-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 webhostingsA
Read-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 recordA
DestructiveIdempotent

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 forwarderA
DestructiveIdempotent

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 APIA
Destructive

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

    A3.5/5.0

    Scored across 19 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers