Building an MCP server for a Swiss hosting provider (and what reverse-engineering its manager taught me) Development of an unofficial MCP server for Infomaniak, a Swiss hosting provider, which enables natural language control of web hosting, mail, DNS, and other services through AI clients like Claude. The author discovered that Infomaniak's public API is largely read-only, while actual write operations (like creating sites or mailboxes) require reverse-engineering the manager's private API endpoints. The project implements rate limiting via a token-bucket system to handle Infomaniak's 60 requests per minute cap, and is available as an open-source npm package. I spent the last six weeks building an unofficial MCP server for Infomaniak — the Swiss hosting provider — that lets Claude and any MCP client drive web hosting, mail, kDrive, DNS, SSL certificates and AI tools from natural language. It's MIT, on npm as infomaniak-mcp-agent , runs locally over stdio. This post walks through what I learned, what's surprisingly hard, and what I'd do differently. Repo: https://github.com/Mogacode-ma/infomaniak-mcp-agent https://github.com/Mogacode-ma/infomaniak-mcp-agent Why an MCP for Infomaniak specifically I run 200+ websites for clients across Belgium, Luxembourg, France and Morocco. Most live on Infomaniak managed cloud, shared hosting, mail, DNS . Day-to-day operations are: provision a new site, swap a DNS record, add a mailbox, request an SSL cert, audit which domains expire in the next 60 days. These tasks are all doable from the manager UI, all doable via the public API — but only one or two clicks/calls each, and they don't compose. Claude is good at composition: "audit all my DNS zones for missing DNSSEC, list every domain whose certificate expires in the next 30 days, and create a redirect from www.legacy-site.be to legacy-site.be on the production hosting." That's three API calls minimum, and the cognitive overhead of remembering the right endpoint each time is the friction I wanted to remove. MCP is the right shape for this: - Tools are typed Zod → JSON Schema → MCP - Side effects are explicit idempotent? destructive? confirmation required? - The LLM doesn't need to know HTTP — it sees a catalogue of named operations The architecture in one paragraph A single Node 18+ binary, ESM, stdio transport. 54 tools registered with the MCP SDK, each backed by a thin function calling api.infomaniak.com Bearer token or manager.infomaniak.com/proxy/... cookie-authenticated . A token-bucket throttles to 60 req/min Infomaniak's hard cap . Confirmation tokens for destructive operations TTL 60s by default . Per-tool tests, ESLint, Prettier, gitleaks, CodeQL, vitest with 35% coverage and climbing. Install: npx -y infomaniak-mcp-agent . Config: one env var INFOMANIAK API TOKEN , generated at https://manager.infomaniak.com/v3/api-token https://manager.infomaniak.com/v3/api-token . The first surprise: the public API is missing half of what the manager does I started with the public Infomaniak API. Documented at https://developer.infomaniak.com https://developer.infomaniak.com , neat OpenAPI-ish spec, Bearer auth. Within a week I'd wrapped most read operations: list sites, list databases, list domains, list mailboxes. Then I tried to create a site . The public POST endpoint returned 200 OK with a site ID. The site never appeared in the manager. No error. Just... nothing. I diffed the network tab of the manager's "Create site" wizard against what I was sending. The manager wasn't calling the public API at all. It was calling manager.infomaniak.com/proxy/