inwx-mcp
# @silentfuture/inwx-mcp
An [MCP](https://modelcontextprotocol.io) server for the [INWX](https://www.inwx.com) domain registrar.
It lets Claude Code, Claude Desktop, Cursor and any other MCP client manage domains through
INWX's official DomRobot JSON-RPC API: list and inspect domains, check availability and prices,
start transfers, change nameservers, manage contact handles and INWX-hosted DNS zones.
Built by [SilentFuture](https://silentfuture.de) while moving ~100 domains from legacy hosters
to INWX and Cloudflare DNS. Uses the official `domrobot-client` package, no scraping.
## Quick start
Add to your MCP client configuration (Claude Code: `.mcp.json` in the project, or `claude mcp add`):
```json
{
"mcpServers": {
"inwx": {
"command": "npx",
"args": ["-y", "@silentfuture/inwx-mcp"],
"env": {
"INWX_USERNAME": "your-inwx-login",
"INWX_PASSWORD": "your-inwx-password",
"INWX_SHARED_SECRET": "",
"INWX_ENV": "live"
}
}
}
}
```
| Variable | Meaning |
|---|---|
| `INWX_USERNAME` | INWX login (required) |
| `INWX_PASSWORD` | INWX password (required) |
| `INWX_SHARED_SECRET` | TOTP shared secret if two-factor auth is enabled on the account (optional) |
| `INWX_ENV` | `live` (default) or `ote` for the INWX test system. OTE uses a separate account from [ote.inwx.com](https://ote.inwx.com) |
Start with `INWX_ENV=ote` if you want to try the write tools without spending money.
## Tools
| Tool | Kind | DomRobot method |
|---|---|---|
| `account_info` | read | `account.info` |
| `domain_list` | read | `domain.list` (filter, paging) |
| `domain_info` | read | `domain.info` (contacts, nameservers, lock, renewal mode) |
| `domain_check` | read | `domain.check` (up to 50 domains) |
| `domain_price` | read | `domain.getPrices` |
| `domain_log` | read | `domain.log` |
| `domain_transfer` | write, costs money | `domain.transfer` (auth code, nameservers, contact handles) |
| `domain_update` | write | `domain.update` (nameservers, transfer lock, renewal mode, contacts) |
| `domain_renew` | write, costs money | `domain.renew` |
| `contact_list`, `contact_info` | read | `contact.list`, `contact.info` |
| `contact_create` | write | `contact.create` |
| `nameserver_list`, `nameserver_info` | read | `nameserver.list`, `nameserver.info` |
| `api_call` | expert | any DomRobot method with raw params |
Every write tool accepts `testing: true`, which makes INWX validate the request without executing it.
Tool descriptions state clearly when a call costs money, so an agent can ask before acting.
## Example prompts
- "List all .de domains in my INWX account with their expiry dates."
- "Check whether example.com and example.io are available and what they cost per year."
- "Transfer example.org to INWX with auth code XYZ, set the nameservers to bingo.ns.cloudflare.com and langston.ns.cloudflare.com, use contact 12345 for all roles. Dry run first."
- "Switch the nameservers of all my domains that still point at ns1.oldhoster.example to Cloudflare."
## Behaviour and safety
- Logs in lazily on the first call and re-authenticates once if the INWX session expired (codes 2200/2201).
- Response codes 1000-1999 are success; anything else is returned as an MCP tool error with INWX's code, message and reason.
- Credentials are read from the environment only. Nothing is written to disk.
- Transfers of gTLDs add one year of runtime; .de and .eu transfers keep their runtime. .de domains need an owner with a German address or a German admin contact.
## Development
```sh
pnpm install
pnpm dev # runs src/index.ts via tsx
pnpm build # emits dist/index.js
```
Requirements: Node 22+, pnpm 10.
## License
MIT, SilentFuture UG (haftungsbeschraenkt). Not affiliated with INWX GmbH.
TDQS
Scored across 15 tools
Each tool targets a distinct resource-and-action pair: account, domain, contact, nameserver, or raw API access. List vs. detail vs. write vs. read-only operations are clearly separated, so an agent should not easily confuse them.
Tool names follow a consistent resource_action snake_case pattern, e.g. domain_list, domain_info, domain_renew, contact_create, nameserver_list. The only generic name, api_call, is intentionally presented as an expert fallback, not as part of the normal naming pattern.
15 tools is at the upper bound of the ideal range, but each covers a necessary INWX domain-management concern: account, domains, contacts, nameservers, and raw API access. There is no obvious padding, and the scope is coherent.
The named tools cover reads plus domain transfer/update/renew and contact create, but miss high-level contact update/delete, domain registration, and nameserver zone modifications. The api_call escape hatch makes those operations possible, but only through raw low-level API calls.