domeneshop-mcp 1.1.1 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +127 -63
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # domeneshop-mcp
2
2
 
3
+ ## 1.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#44](https://github.com/martinzachariassen/domeneshop-mcp/pull/44) [`a369442`](https://github.com/martinzachariassen/domeneshop-mcp/commit/a369442f0a0e50de5dee77c9ec220fc35a7818f6) Thanks [@martinzachariassen](https://github.com/martinzachariassen)! - README: add a short "New to MCP?" primer, expand the Claude Code quick start (read-only and scope flags, `/mcp` check), document the Claude Desktop bundle step by step, and add a configuration table and more troubleshooting.
8
+
9
+ ## 1.1.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [#42](https://github.com/martinzachariassen/domeneshop-mcp/pull/42) [`b4145b9`](https://github.com/martinzachariassen/domeneshop-mcp/commit/b4145b910774e8f7e1c1ad66c9e2a226d036b0cc) Thanks [@martinzachariassen](https://github.com/martinzachariassen)! - Update dependencies, including zod 4.6.7, and add a banner to the README.
14
+
3
15
  ## 1.1.1
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
- <h1 align="center">domeneshop-mcp</h1>
2
-
3
1
  <p align="center">
4
- Manage your Domeneshop domains, DNS records, HTTP forwards, dynamic DNS and invoices from any AI assistant.
2
+ <picture>
3
+ <source media="(prefers-color-scheme: dark)" srcset=".github/assets/banner-dark.png">
4
+ <img src=".github/assets/banner-light.png" alt="domeneshop-mcp — MCP server for Domeneshop domains, DNS, HTTP forwards, dynamic DNS and invoices" width="100%">
5
+ </picture>
5
6
  </p>
6
7
 
7
8
  <p align="center">
@@ -15,15 +16,17 @@
15
16
  </p>
16
17
 
17
18
  <p align="center">
18
- <a href="https://www.npmjs.com/package/domeneshop-mcp"><b>npm package</b></a>
19
+ <a href="#quick-start"><b>Quick start</b></a>
19
20
  &nbsp;·&nbsp;
20
- <a href="https://github.com/martinzachariassen/homebrew-tap"><b>Homebrew tap</b></a>
21
+ <a href="#client-setup"><b>Client setup</b></a>
21
22
  &nbsp;·&nbsp;
22
- <a href="https://api.domeneshop.no/docs/"><b>Domeneshop API</b></a>
23
+ <a href="#tools"><b>Tools</b></a>
23
24
  &nbsp;·&nbsp;
24
- <a href="https://www.domeneshop.no/admin?view=api"><b>Get API credentials</b></a>
25
+ <a href="#access-control"><b>Access control</b></a>
25
26
  &nbsp;·&nbsp;
26
- <a href="https://registry.modelcontextprotocol.io/v0/servers?search=io.github.martinzachariassen/domeneshop-mcp"><b>MCP Registry</b></a>
27
+ <a href="#troubleshooting"><b>Troubleshooting</b></a>
28
+ &nbsp;·&nbsp;
29
+ <a href="https://www.domeneshop.no/admin?view=api"><b>Get API credentials</b></a>
27
30
  </p>
28
31
 
29
32
  An [MCP](https://modelcontextprotocol.io) server that turns the
@@ -34,6 +37,31 @@ forwarding, dynamic DNS and invoices.
34
37
  It talks MCP over stdio, so it works with **any MCP-compatible client**: Claude
35
38
  Code, Claude Desktop, Cursor, VS Code, Codex, Windsurf, Cline and others.
36
39
 
40
+ <details>
41
+ <summary><strong>New to MCP? Start here</strong></summary>
42
+
43
+ [MCP](https://modelcontextprotocol.io) (Model Context Protocol) is an open
44
+ standard that lets AI apps call outside tools. This package is an *MCP server*:
45
+ a small program your AI app starts in the background and talks to. Once it is
46
+ registered, you just ask in plain language — "point blog.example.no at
47
+ 203.0.113.10" — and the assistant picks the right tool, shows you what it is
48
+ about to do and asks before changing anything.
49
+
50
+ You never run the server yourself, and you do not need to know the tool names.
51
+ What you need:
52
+
53
+ - A **Domeneshop API token and secret**, a key pair that lets a program act on
54
+ your account. Treat them like a password.
55
+ - An **MCP client**, the app you chat with. Claude Code is used below; any
56
+ other works too (see [Client setup](#client-setup)).
57
+ - **Node.js 20.3+** ([download the LTS](https://nodejs.org)) or Homebrew. Not
58
+ needed for the Claude Desktop bundle.
59
+
60
+ If you are unsure about letting an assistant change live DNS, start in
61
+ [read-only mode](#access-control): it can look at everything but change nothing.
62
+
63
+ </details>
64
+
37
65
  ## Quick start
38
66
 
39
67
  You need a Domeneshop account, plus either Node.js 20.3 or newer (for `npx`) or
@@ -42,16 +70,23 @@ You need a Domeneshop account, plus either Node.js 20.3 or newer (for `npx`) or
42
70
  **1. Create an API token and secret** at
43
71
  [domeneshop.no/admin?view=api](https://www.domeneshop.no/admin?view=api).
44
72
 
45
- **2. Register the server.** In Claude Code:
73
+ **2. Register the server** in [Claude Code](https://claude.com/claude-code),
74
+ replacing the placeholders with your token and secret:
46
75
 
47
76
  ```sh
48
77
  claude mcp add domeneshop \
49
- --env DOMENESHOP_API_TOKEN=your-token \
50
- --env DOMENESHOP_API_SECRET=your-secret \
78
+ --env DOMENESHOP_API_TOKEN=<your-api-token> \
79
+ --env DOMENESHOP_API_SECRET=<your-api-secret> \
51
80
  -- npx -y domeneshop-mcp
52
81
  ```
53
82
 
54
- **3. Ask for something.** "List my domains" is enough to confirm the tools loaded.
83
+ Add `--env DOMENESHOP_READ_ONLY=true` to start with read-only tools only, and
84
+ `--scope user` to make it available in every project (the default is the
85
+ current project only).
86
+
87
+ **3. Ask for something.** Start a new `claude` session and try "List my
88
+ Domeneshop domains". Running `/mcp` inside Claude Code shows whether the server
89
+ connected.
55
90
 
56
91
  **Using Homebrew instead of npx?** Install once, then register the binary in
57
92
  step 2 with `-- domeneshop-mcp` in place of `-- npx -y domeneshop-mcp`:
@@ -60,31 +95,33 @@ step 2 with `-- domeneshop-mcp` in place of `-- npx -y domeneshop-mcp`:
60
95
  brew install martinzachariassen/tap/domeneshop-mcp
61
96
  ```
62
97
 
63
- Using a different client? See [Client setup](#client-setup) below.
98
+ **Using a different client?** Claude Desktop has a one-click bundle that needs
99
+ no Node.js; Cursor, VS Code, Codex and others take a short config block. See
100
+ [Client setup](#client-setup).
64
101
 
65
- ## Client setup
66
-
67
- The server is launched by your client rather than run by hand, and reads its
68
- credentials from two environment variables:
102
+ ## What you can ask for
69
103
 
70
- | Variable | Description |
104
+ | Area | Example prompt |
71
105
  | --- | --- |
72
- | `DOMENESHOP_API_TOKEN` | API token from the Domeneshop control panel |
73
- | `DOMENESHOP_API_SECRET` | The matching API secret |
106
+ | Domains | "Which domains are on my account, and when do they renew?" |
107
+ | DNS | "Show every DNS record for example.no" |
108
+ | DNS | "Point blog.example.no at 203.0.113.10" |
109
+ | DNS | "Lower the TTL on the www record for example.no to 5 minutes" |
110
+ | DNS | "Add the TXT record Google gave me for domain verification" |
111
+ | DNS | "Set up Fastmail's MX records on example.no" |
112
+ | Forwarding | "Forward old.example.no to https://example.no" |
113
+ | Dynamic DNS | "Update home.example.no to my current IP" |
114
+ | Invoices | "List my unpaid Domeneshop invoices" |
74
115
 
75
- Optional settings (see [Access control](#access-control) and
76
- [Troubleshooting](#troubleshooting)):
116
+ ## Client setup
77
117
 
78
- | Variable | Description |
79
- | --- | --- |
80
- | `DOMENESHOP_READ_ONLY` | `true` to expose only read-only tools |
81
- | `DOMENESHOP_TOOLS` | Comma-separated allowlist of tool names to expose |
82
- | `DOMENESHOP_DISABLED_TOOLS` | Comma-separated tool names to hide |
83
- | `DOMENESHOP_TIMEOUT_MS` | Per-request timeout in milliseconds (default `30000`) |
84
- | `DOMENESHOP_DEBUG` | `true` to log every API request to stderr |
118
+ The server is launched by your client rather than run by hand. It needs two
119
+ environment variables, `DOMENESHOP_API_TOKEN` and `DOMENESHOP_API_SECRET`; the
120
+ optional ones are listed under [Configuration](#configuration).
85
121
 
86
- Most clients take the same **standard config**. Swap in your real token and
87
- secret wherever you see the placeholders.
122
+ Most clients take the same **standard config**. Replace the placeholders with
123
+ your token and secret, and if the file already lists other servers, add the
124
+ `"domeneshop"` entry inside the existing `"mcpServers"` object:
88
125
 
89
126
  ```json
90
127
  {
@@ -93,8 +130,8 @@ secret wherever you see the placeholders.
93
130
  "command": "npx",
94
131
  "args": ["-y", "domeneshop-mcp"],
95
132
  "env": {
96
- "DOMENESHOP_API_TOKEN": "your-token",
97
- "DOMENESHOP_API_SECRET": "your-secret"
133
+ "DOMENESHOP_API_TOKEN": "<your-api-token>",
134
+ "DOMENESHOP_API_SECRET": "<your-api-secret>"
98
135
  }
99
136
  }
100
137
  }
@@ -116,23 +153,29 @@ write `<your-project>/.mcp.json` instead, shared via version control, or
116
153
  You can also pass the standard config as raw JSON:
117
154
 
118
155
  ```sh
119
- claude mcp add-json domeneshop '{"command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"your-token","DOMENESHOP_API_SECRET":"your-secret"}}'
156
+ claude mcp add-json domeneshop '{"command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"<your-api-token>","DOMENESHOP_API_SECRET":"<your-api-secret>"}}'
120
157
  ```
121
158
 
122
159
  Or write the standard config straight into `<your-project>/.mcp.json`.
160
+ `claude mcp list` shows registered servers and whether they connect.
123
161
 
124
162
  </details>
125
163
 
126
164
  <details>
127
165
  <summary><strong>Claude Desktop</strong></summary>
128
166
 
129
- The easiest route is the one-click bundle: download `domeneshop-mcp-<version>.mcpb`
130
- from the [latest release](https://github.com/martinzachariassen/domeneshop-mcp/releases/latest)
131
- and open it. Claude Desktop asks for your token and secret, stores them securely,
132
- and offers a read-only toggle.
167
+ The easiest route is the one-click bundle, which needs no Node.js:
168
+
169
+ 1. Download `domeneshop-mcp-<version>.mcpb` from the
170
+ [latest release](https://github.com/martinzachariassen/domeneshop-mcp/releases/latest).
171
+ 2. Open it (double-click, or drag it into Claude Desktop).
172
+ 3. Paste your token and secret, optionally turn on read-only mode, and install.
173
+
174
+ Claude Desktop stores the credentials securely.
133
175
 
134
- To configure it by hand instead, add the standard config to `claude_desktop_config.json`, reachable from
135
- Settings → Developer → Edit Config:
176
+ To configure it by hand instead, add the standard config to
177
+ `claude_desktop_config.json`, reachable from Settings → Developer → Edit Config,
178
+ then restart Claude Desktop:
136
179
 
137
180
  | Platform | Full path |
138
181
  | --- | --- |
@@ -169,8 +212,8 @@ VS Code uses a `servers` key instead of `mcpServers`, and wants an explicit
169
212
  "command": "npx",
170
213
  "args": ["-y", "domeneshop-mcp"],
171
214
  "env": {
172
- "DOMENESHOP_API_TOKEN": "your-token",
173
- "DOMENESHOP_API_SECRET": "your-secret"
215
+ "DOMENESHOP_API_TOKEN": "<your-api-token>",
216
+ "DOMENESHOP_API_SECRET": "<your-api-secret>"
174
217
  }
175
218
  }
176
219
  }
@@ -181,7 +224,7 @@ For every project, run the command palette action **MCP: Open User
181
224
  Configuration** and add the same block there, or register it in one line:
182
225
 
183
226
  ```sh
184
- code --add-mcp '{"name":"domeneshop","command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"your-token","DOMENESHOP_API_SECRET":"your-secret"}}'
227
+ code --add-mcp '{"name":"domeneshop","command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"<your-api-token>","DOMENESHOP_API_SECRET":"<your-api-secret>"}}'
185
228
  ```
186
229
 
187
230
  </details>
@@ -200,7 +243,7 @@ Codex CLI reads MCP servers from `mcp_servers` in its config file:
200
243
  [mcp_servers.domeneshop]
201
244
  command = "npx"
202
245
  args = ["-y", "domeneshop-mcp"]
203
- env = { DOMENESHOP_API_TOKEN = "your-token", DOMENESHOP_API_SECRET = "your-secret" }
246
+ env = { DOMENESHOP_API_TOKEN = "<your-api-token>", DOMENESHOP_API_SECRET = "<your-api-secret>" }
204
247
  ```
205
248
 
206
249
  `codex mcp add domeneshop -- npx -y domeneshop-mcp` registers it from the
@@ -251,8 +294,8 @@ Desktop usually do not see Homebrew's `PATH`, so give them the full path
251
294
  "domeneshop": {
252
295
  "command": "/opt/homebrew/bin/domeneshop-mcp",
253
296
  "env": {
254
- "DOMENESHOP_API_TOKEN": "your-token",
255
- "DOMENESHOP_API_SECRET": "your-secret"
297
+ "DOMENESHOP_API_TOKEN": "<your-api-token>",
298
+ "DOMENESHOP_API_SECRET": "<your-api-secret>"
256
299
  }
257
300
  }
258
301
  }
@@ -261,19 +304,20 @@ Desktop usually do not see Homebrew's `PATH`, so give them the full path
261
304
 
262
305
  </details>
263
306
 
264
- ## What you can ask for
307
+ ## Configuration
265
308
 
266
- | Area | Example prompt |
267
- | --- | --- |
268
- | Domains | "Which domains are on my account, and when do they renew?" |
269
- | DNS | "Show every DNS record for example.no" |
270
- | DNS | "Point blog.example.no at 203.0.113.10" |
271
- | DNS | "Lower the TTL on the www record for example.no to 5 minutes" |
272
- | DNS | "Add the TXT record Google gave me for domain verification" |
273
- | DNS | "Set up Fastmail's MX records on example.no" |
274
- | Forwarding | "Forward old.example.no to https://example.no" |
275
- | Dynamic DNS | "Update home.example.no to my current IP" |
276
- | Invoices | "List my unpaid Domeneshop invoices" |
309
+ All settings are environment variables, passed with `--env` in Claude Code or
310
+ in the `env` block of the config above. Only the first two are required.
311
+
312
+ | Variable | Required | Description |
313
+ | --- | --- | --- |
314
+ | `DOMENESHOP_API_TOKEN` | Yes | API token from the Domeneshop control panel |
315
+ | `DOMENESHOP_API_SECRET` | Yes | The matching API secret |
316
+ | `DOMENESHOP_READ_ONLY` | No | `true` to expose only read-only tools |
317
+ | `DOMENESHOP_TOOLS` | No | Comma-separated allowlist of tool names to expose |
318
+ | `DOMENESHOP_DISABLED_TOOLS` | No | Comma-separated tool names to hide |
319
+ | `DOMENESHOP_TIMEOUT_MS` | No | Per-request timeout in milliseconds (default `30000`) |
320
+ | `DOMENESHOP_DEBUG` | No | `true` to log every API request to stderr |
277
321
 
278
322
  ## Tools
279
323
 
@@ -339,7 +383,7 @@ Hidden tools are not registered at all, so the model never sees them.
339
383
 
340
384
  - **Read-only mode.** Set `DOMENESHOP_READ_ONLY=true` to expose only the eight
341
385
  read-only tools. This is a good default if you mainly ask questions about your
342
- domains, DNS and invoices.
386
+ domains, DNS and invoices, or are trying the server out for the first time.
343
387
  - **Allowlist.** Set `DOMENESHOP_TOOLS=list_domains,list_dns_records,patch_dns_record`
344
388
  to expose exactly those tools.
345
389
  - **Denylist.** Set `DOMENESHOP_DISABLED_TOOLS=delete_dns_record,delete_forward`
@@ -352,8 +396,17 @@ Most clients ask before running a tool not annotated read-only. Keep that
352
396
  confirmation on for this server: write tools change live DNS, and a wrong
353
397
  record can take a site or mailbox offline.
354
398
 
399
+ Credentials are only ever sent to `api.domeneshop.no` and are never logged. To
400
+ revoke access, delete the token in the Domeneshop control panel.
401
+
355
402
  ## Troubleshooting
356
403
 
404
+ - **The tools do not show up**: restart the client (most only load servers at
405
+ startup) or, in Claude Code, check `/mcp`. Run `npx -y domeneshop-mcp --version`
406
+ to check that Node.js 20.3+ and npx work. If you edited a JSON config by hand,
407
+ make sure it is still valid JSON. With `DOMENESHOP_DEBUG=true` the server logs
408
+ every API request (method, path, status and duration, never credentials) to
409
+ stderr, which most clients capture in their MCP logs.
357
410
  - **`API returned status 401`**: the token or secret is wrong. Copy both again
358
411
  from [domeneshop.no/admin?view=api](https://www.domeneshop.no/admin?view=api).
359
412
  Surrounding whitespace is trimmed automatically.
@@ -362,10 +415,11 @@ record can take a site or mailbox offline.
362
415
  - **Timeouts**: requests give up after 30 seconds. Idempotent requests are
363
416
  retried on rate limiting and temporary errors. Raise the limit with
364
417
  `DOMENESHOP_TIMEOUT_MS` if needed.
365
- - **The tools do not show up**: run `npx -y domeneshop-mcp --version` to check
366
- that Node.js 20.3+ and npx work, then check your client's MCP logs. With
367
- `DOMENESHOP_DEBUG=true` the server logs every API request (method, path,
368
- status and duration, never credentials) to stderr, which most clients capture.
418
+ - **A DNS change does not show up**: DNS is cached for the record's TTL (3600
419
+ seconds by default), so other resolvers may serve the old value for up to an
420
+ hour. Ask the assistant to show the record to confirm Domeneshop stored it.
421
+
422
+ Still stuck? [Open an issue](https://github.com/martinzachariassen/domeneshop-mcp/issues/new/choose).
369
423
 
370
424
  ## Reference
371
425
 
@@ -407,6 +461,16 @@ spec, but are supported and used by their own client libraries:
407
461
 
408
462
  </details>
409
463
 
464
+ <details>
465
+ <summary><strong>Distribution</strong></summary>
466
+
467
+ - [npm package](https://www.npmjs.com/package/domeneshop-mcp)
468
+ - [Homebrew tap](https://github.com/martinzachariassen/homebrew-tap)
469
+ - [MCP Registry](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.martinzachariassen/domeneshop-mcp)
470
+ - [Claude Desktop bundle](https://github.com/martinzachariassen/domeneshop-mcp/releases/latest) (`.mcpb` on each release)
471
+
472
+ </details>
473
+
410
474
  ## Development
411
475
 
412
476
  ```sh
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "domeneshop-mcp",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "MCP server exposing the Domeneshop API — manage domains, DNS records, HTTP forwards, dynamic DNS and invoices from an AI assistant.",
5
5
  "mcpName": "io.github.martinzachariassen/domeneshop-mcp",
6
6
  "type": "module",