Domeneshop MCP

Manage Domeneshop domains, DNS records, HTTP forwards, dynamic DNS and invoices from your AI assistant.

Documentation

domeneshop-mcp — MCP server for Domeneshop domains, DNS, HTTP forwards, dynamic DNS and invoices

CI npm version npm downloads License

Manage your Domeneshop domains by asking your AI assistant. DNS records, HTTP forwards, dynamic DNS and invoices, all in plain language. Works with Claude, Cursor, VS Code, Codex and any other MCP client.

"Set up email for example.no"
"Point blog.example.no at 203.0.113.10"
"Which of my domains renew this year?"

The assistant picks the right tool, shows you what it is about to change and asks before it does.

Getting started

1. Get an API token and secret from domeneshop.no/admin?view=api.

2. Add the server. With Claude Code:

claude mcp add domeneshop \
  --env DOMENESHOP_API_TOKEN=<your-api-token> \
  --env DOMENESHOP_API_SECRET=<your-api-secret> \
  -- npx -y domeneshop-mcp

Using Claude Desktop, Cursor, VS Code or something else? Pick your client below. Most have a one-click install.

3. Try it. Start a new session and ask "List my Domeneshop domains".

[!TIP] Not ready to let an assistant touch live DNS? Add --env DOMENESHOP_READ_ONLY=true and it can look at everything but change nothing.

Requires Node.js 22 or newer (download), except for the Claude Desktop bundle.

New to MCP?

MCP (Model Context Protocol) is an open standard that lets AI apps call outside tools. This package is an MCP server: a small program your AI app starts in the background. You never run it yourself and you do not need to know the tool names. You just ask.

The API token and secret let a program act on your Domeneshop account, so treat them like a password.

What you can ask for

AreaExample prompt
Domains"Which domains are on my account, and when do they renew?"
DNS"Show every DNS record for example.no"
DNS"Lower the TTL on the www record for example.no to 5 minutes"
DNS"Add the TXT record Google gave me for domain verification"
Forwarding"Forward old.example.no to https://example.no"
Dynamic DNS"Update home.example.no to my current IP"
Invoices"List my unpaid Domeneshop invoices"

Client setup

Every client needs the same two environment variables, DOMENESHOP_API_TOKEN and DOMENESHOP_API_SECRET. Most take this standard config. If the file already lists other servers, add the "domeneshop" entry inside the existing "mcpServers" object:

{
  "mcpServers": {
    "domeneshop": {
      "command": "npx",
      "args": ["-y", "domeneshop-mcp"],
      "env": {
        "DOMENESHOP_API_TOKEN": "<your-api-token>",
        "DOMENESHOP_API_SECRET": "<your-api-secret>"
      }
    }
  }
}
Claude Code

Use the command from Getting started. It registers the server for you in this project only (--scope local). Add --scope user to make it available in every project, or --scope project to write <your-project>/.mcp.json and share it through version control.

You can also pass the standard config as raw JSON:

claude mcp add-json domeneshop '{"command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"<your-api-token>","DOMENESHOP_API_SECRET":"<your-api-secret>"}}'

Run /mcp in a session, or claude mcp list, to check that it connects.

Claude Desktop: one-click bundle, no Node.js needed
  1. Download domeneshop-mcp-<version>.mcpb from the latest release.
  2. Open it (double-click, or drag it into Claude Desktop).
  3. Paste your token and secret, optionally turn on read-only mode, and install.

Claude Desktop stores the credentials securely.

To configure it by hand instead, add the standard config to claude_desktop_config.json (Settings → Developer → Edit Config), then restart Claude Desktop:

PlatformFull path
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux (unofficial builds)~/.config/Claude/claude_desktop_config.json
Cursor: one-click install

Install in Cursor

The button installs the server with placeholder credentials. Afterwards, open Settings → MCP, edit the domeneshop entry and replace <your-api-token> and <your-api-secret> with your own.

To set it up by hand instead, add the standard config to an mcp.json file:

ScopeFull path
This project only<your-project>/.cursor/mcp.json
Every project (macOS/Linux)~/.cursor/mcp.json
Every project (Windows)%USERPROFILE%\.cursor\mcp.json
VS Code (GitHub Copilot): one-click install

Install in VS Code Install in VS Code Insiders

The buttons install the server in your user configuration. VS Code then asks for your token and secret and stores them securely, so nothing is written to a config file in plain text.

To set it up by hand instead, note that VS Code uses a servers key instead of mcpServers and wants an explicit type. For this project only, add it to <your-project>/.vscode/mcp.json:

{
  "servers": {
    "domeneshop": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "domeneshop-mcp"],
      "env": {
        "DOMENESHOP_API_TOKEN": "<your-api-token>",
        "DOMENESHOP_API_SECRET": "<your-api-secret>"
      }
    }
  }
}

For every project, run MCP: Open User Configuration from the command palette and add the same block, or register it in one line:

code --add-mcp '{"name":"domeneshop","command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"<your-api-token>","DOMENESHOP_API_SECRET":"<your-api-secret>"}}'
Codex

Add this to ~/.codex/config.toml (%USERPROFILE%\.codex\config.toml on Windows):

[mcp_servers.domeneshop]
command = "npx"
args = ["-y", "domeneshop-mcp"]
env = { DOMENESHOP_API_TOKEN = "<your-api-token>", DOMENESHOP_API_SECRET = "<your-api-secret>" }

codex mcp add domeneshop -- npx -y domeneshop-mcp also works, but takes no env flags, so set the two variables in the block it creates.

Windsurf, Cline, Continue, LM Studio and others

Anything that runs MCP servers over stdio works. Most use the standard config above. Check your client's documentation for the config file and key name, then point it at:

  • command: npx
  • args: ["-y", "domeneshop-mcp"]
  • env: DOMENESHOP_API_TOKEN and DOMENESHOP_API_SECRET
Install with Homebrew or npm instead of npx

To avoid resolving the package on every launch, install it once and use domeneshop-mcp as the command with no args:

brew install martinzachariassen/tap/domeneshop-mcp   # macOS/Linux, installs Node.js if missing
npm install -g domeneshop-mcp                        # or with npm

In Claude Code, that means -- domeneshop-mcp in place of -- npx -y domeneshop-mcp. brew upgrade domeneshop-mcp picks up new releases.

GUI apps such as Claude Desktop usually do not see Homebrew's PATH, so give them the full path. brew --prefix prints it: /opt/homebrew on Apple silicon, /usr/local on Intel Macs, /home/linuxbrew/.linuxbrew on Linux.

{
  "mcpServers": {
    "domeneshop": {
      "command": "/opt/homebrew/bin/domeneshop-mcp",
      "env": {
        "DOMENESHOP_API_TOKEN": "<your-api-token>",
        "DOMENESHOP_API_SECRET": "<your-api-secret>"
      }
    }
  }
}

Configuration

All settings are environment variables, passed with --env in Claude Code or in the env block of your client config. Only the first two are required.

VariableRequiredDescription
DOMENESHOP_API_TOKENYesAPI token from the Domeneshop control panel
DOMENESHOP_API_SECRETYesThe matching API secret
DOMENESHOP_READ_ONLYNotrue to expose only read-only tools
DOMENESHOP_TOOLSNoComma-separated allowlist of tool names to expose
DOMENESHOP_DISABLED_TOOLSNoComma-separated tool names to hide
DOMENESHOP_TIMEOUT_MSNoPer-request timeout in milliseconds (default 30000)
DOMENESHOP_DEBUGNotrue to log every API request to stderr

Tools

17 tools cover every operation the Domeneshop API offers. You don't need to know their names, because the assistant picks them for you. Arguments are validated before anything is sent (TTL range, URL scheme, IP addresses, the fields each record type requires), so a mistake comes back as an explanation, not a bare API error.

[!WARNING] update_dns_record replaces the whole record: omitted fields are dropped and an omitted ttl resets to 3600 seconds. Use patch_dns_record to change only some fields. upsert_dns_record refuses to act when a host has several records of the same type (typical for MX and TXT) and lists their IDs instead.

All tools

Access mirrors the MCP annotations each tool declares, which clients use to decide what to run without asking.

AreaToolAccessDescription
Domainslist_domainsRead-onlyList all domains on the account, optionally filtered by name
get_domainRead-onlyGet a single domain by its Domeneshop domain ID
DNSlist_dns_recordsRead-onlyList a domain's records, optionally filtered by host and type
get_dns_recordRead-onlyGet a single record by ID
create_dns_recordAddsCreate a record and return it as stored
update_dns_recordOverwritesReplace a whole record (see the warning above)
patch_dns_recordOverwritesChange only the given fields of a record
upsert_dns_recordOverwritesUpdate the single record for a host and type, or create it if there is none
delete_dns_recordDeletesDelete a record
Forwardinglist_forwardsRead-onlyList a domain's HTTP forwards
get_forwardRead-onlyGet the forward for one host
create_forwardAddsCreate a forward to an http://, https:// or ftp:// URL
update_forwardOverwritesUpdate a forward's destination or frame setting; an omitted frame keeps its stored value
delete_forwardDeletesDelete a forward
Dynamic DNSupdate_dyndnsOverwritesPoint one or more comma-separated hostnames at up to nine IPv4/IPv6 addresses, or at the caller's apparent IP; creates the record if missing
Invoiceslist_invoicesRead-onlyList invoices from the past three years, optionally filtered by status
get_invoiceRead-onlyGet a single invoice
Supported DNS record types

All eleven record types Domeneshop accepts are supported:

TypeFields beyond host, data and ttl
A, AAAA, ANAME, CNAME, NS, TXT—
MXpriority
SRVpriority, weight, port
TLSAusage, selector, dtype
DStag, alg, digest
CAAflags, tag

tag is a number for DS (the key tag, 0-65535) and a string for CAA (the property tag, such as issue). A and AAAA data must be an address of the matching family, and the numeric fields are range-checked.

Safety

[!IMPORTANT] Domeneshop has no scoped tokens: a token can do everything your account can. Limit what the assistant can do by limiting which tools the server exposes.

  • Read-only mode: DOMENESHOP_READ_ONLY=true exposes only the eight read-only tools. This is a good default for trying the server out.
  • Allowlist: DOMENESHOP_TOOLS=list_domains,list_dns_records,patch_dns_record exposes exactly those tools.
  • Denylist: DOMENESHOP_DISABLED_TOOLS=delete_dns_record,delete_forward hides specific tools.

Hidden tools are not registered at all, so the model never sees them. The settings combine, and a misspelled tool name stops the server at startup instead of being silently ignored.

Keep your client's confirmation prompt on for write tools. They change live DNS, and a wrong record can take a site or mailbox offline.

Credentials are only sent to api.domeneshop.no and are never logged. To revoke access, delete the token in the Domeneshop control panel.

Troubleshooting

ProblemFix
The tools don't show upRestart the client (most load servers only at startup), or check /mcp in Claude Code. Run npx -y domeneshop-mcp --version to confirm Node.js 22+ and npx work. If you edited a JSON config by hand, check that it is still valid.
API returned status 401The token or secret is wrong. Copy both again from domeneshop.no/admin?view=api. Surrounding whitespace is trimmed automatically.
API returned status 404The domain or record ID doesn't exist on this account. Ask the assistant to list domains or records first.
TimeoutsRequests give up after 30 seconds. Idempotent requests are retried on rate limiting and temporary errors. Raise the limit with DOMENESHOP_TIMEOUT_MS.
A DNS change doesn't show upDNS is cached for the record's TTL (3600 seconds by default), so resolvers may serve the old value for up to an hour. Ask the assistant to show the record to confirm Domeneshop stored it.

For more detail, set DOMENESHOP_DEBUG=true. The server then logs every API request (method, path, status and duration, never credentials) to stderr, which most clients show in their MCP logs.

Still stuck? Open an issue.

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md for the development workflow, and the API notes for undocumented Domeneshop behaviour the client relies on. Everyone taking part is expected to follow the Code of Conduct.

Available on npm, Homebrew, the MCP Registry and as a Claude Desktop bundle. To report a vulnerability, see SECURITY.md. Licensed under MIT.