@dnsdoctor/mcp 1.2.0 → 1.2.1

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/README.md +1 -1
  2. package/package.json +2 -2
  3. package/tools.json +19 -0
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # DNS Doctor — Claude Code plugin
1
+ # DNS Doctor — Claude Code plugin & DNS skill (DMARC, SPF, DKIM)
2
2
 
3
3
  Diagnose and fix a domain's email authentication (SPF, DMARC, DKIM, MX, blacklist,
4
4
  domain/SSL expiry) from inside Claude. This plugin bundles the DNS Doctor **skill**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dnsdoctor/mcp",
3
- "version": "1.2.0",
4
- "description": "Thin stdio MCP server for DNS Doctor — diagnoses SPF, DMARC, DKIM, MX, DNS, blacklist and expiry over the public DNS Doctor REST API.",
3
+ "version": "1.2.1",
4
+ "description": "Thin stdio MCP server for DNS Doctor \u2014 diagnoses SPF, DMARC, DKIM, MX, DNS, blacklist and expiry over the public DNS Doctor REST API.",
5
5
  "license": "Apache-2.0",
6
6
  "author": {
7
7
  "name": "DNS Doctor",
package/tools.json CHANGED
@@ -10,6 +10,7 @@
10
10
  "inputSchema": {
11
11
  "properties": {
12
12
  "domain": {
13
+ "description": "The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.",
13
14
  "title": "Domain",
14
15
  "type": "string"
15
16
  }
@@ -33,10 +34,12 @@
33
34
  "inputSchema": {
34
35
  "properties": {
35
36
  "domain": {
37
+ "description": "The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.",
36
38
  "title": "Domain",
37
39
  "type": "string"
38
40
  },
39
41
  "selector": {
42
+ "description": "The DKIM selector to probe \u2014 the name before ._domainkey, e.g. 'google', 'selector1', or a dotted form like 's1.prod'. The sending platform's settings page names it; it is not guessable from the domain.",
40
43
  "title": "Selector",
41
44
  "type": "string"
42
45
  }
@@ -61,6 +64,7 @@
61
64
  "inputSchema": {
62
65
  "properties": {
63
66
  "domain": {
67
+ "description": "The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.",
64
68
  "title": "Domain",
65
69
  "type": "string"
66
70
  },
@@ -74,9 +78,11 @@
74
78
  }
75
79
  ],
76
80
  "default": null,
81
+ "description": "Optional label to prepend to the domain (e.g. 'mail' to check mail.<domain>) \u2014 honored for txt, cname, a and aaaa only; spf, dmarc and mx derive their own query name.",
77
82
  "title": "Host"
78
83
  },
79
84
  "kind": {
85
+ "description": "Which record to read; the right query is derived from it \u2014 'dmarc' reads TXT at _dmarc.<domain> filtered to v=DMARC1, 'spf' reads the apex TXT filtered to v=spf1, so don't prefix the domain yourself.",
80
86
  "enum": [
81
87
  "spf",
82
88
  "dmarc",
@@ -110,6 +116,7 @@
110
116
  "inputSchema": {
111
117
  "properties": {
112
118
  "ip": {
119
+ "description": "The sending IP to check, IPv4 or IPv6. Must be a public address \u2014 private, loopback and CGNAT ranges have no meaningful reverse DNS and are refused.",
113
120
  "title": "Ip",
114
121
  "type": "string"
115
122
  }
@@ -142,6 +149,7 @@
142
149
  }
143
150
  ],
144
151
  "default": null,
152
+ "description": "Domain whose PUBLISHED SPF record should be resolved and counted recursively (nested includes cost lookups too). Pass exactly one of domain or record, never both.",
145
153
  "title": "Domain"
146
154
  },
147
155
  "record": {
@@ -154,6 +162,7 @@
154
162
  }
155
163
  ],
156
164
  "default": null,
165
+ "description": "A pasted SPF record to parse instead of resolving one, e.g. 'v=spf1 include:_spf.google.com ~all'. Counts this record's own terms only. Pass exactly one of domain or record, never both.",
157
166
  "title": "Record"
158
167
  }
159
168
  },
@@ -173,6 +182,7 @@
173
182
  "inputSchema": {
174
183
  "properties": {
175
184
  "policy": {
185
+ "description": "The requested p= policy: 'none' monitors only, 'quarantine' sends failing mail to spam, 'reject' refuses it outright. Start at 'none' unless the domain's aggregate reports already justify enforcement.",
176
186
  "enum": [
177
187
  "none",
178
188
  "quarantine",
@@ -191,10 +201,12 @@
191
201
  }
192
202
  ],
193
203
  "default": null,
204
+ "description": "Mailbox to receive DMARC aggregate (RUA) reports, as a plain address like dmarc@example.com. Strongly recommended: without it nobody can see who sends as the domain.",
194
205
  "title": "Rua Email"
195
206
  },
196
207
  "strict_alignment": {
197
208
  "default": false,
209
+ "description": "Set true to emit strict alignment (aspf=s adkim=s), requiring an exact domain match instead of the organizational-domain match. Leave false unless you know every sender aligns strictly.",
198
210
  "title": "Strict Alignment",
199
211
  "type": "boolean"
200
212
  },
@@ -213,6 +225,7 @@
213
225
  }
214
226
  ],
215
227
  "default": null,
228
+ "description": "Optional sp= policy for subdomains when it should differ from the main p= policy. Omit to let subdomains inherit p=.",
216
229
  "title": "Subdomain Policy"
217
230
  }
218
231
  },
@@ -235,6 +248,7 @@
235
248
  "inputSchema": {
236
249
  "properties": {
237
250
  "domain": {
251
+ "description": "The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.",
238
252
  "title": "Domain",
239
253
  "type": "string"
240
254
  }
@@ -258,6 +272,7 @@
258
272
  "inputSchema": {
259
273
  "properties": {
260
274
  "content_base64": {
275
+ "description": "One DMARC aggregate (RUA) report file, base64-encoded: the .xml, .xml.gz or .zip attachment exactly as received, up to 2 MiB decoded. Encode the file bytes \u2014 do not paste raw XML here.",
261
276
  "title": "Content Base64",
262
277
  "type": "string"
263
278
  },
@@ -271,6 +286,7 @@
271
286
  }
272
287
  ],
273
288
  "default": null,
289
+ "description": "Optional original attachment filename, recorded in logs only \u2014 format detection is content-based, so this changes nothing about parsing.",
274
290
  "title": "Filename"
275
291
  }
276
292
  },
@@ -293,6 +309,7 @@
293
309
  "inputSchema": {
294
310
  "properties": {
295
311
  "domain": {
312
+ "description": "The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.",
296
313
  "title": "Domain",
297
314
  "type": "string"
298
315
  }
@@ -316,6 +333,7 @@
316
333
  "inputSchema": {
317
334
  "properties": {
318
335
  "domain": {
336
+ "description": "The domain to check, e.g. example.com. Bare registrable names and subdomains both work; scheme, path or port do not belong here. Unicode names are accepted and normalized to punycode.",
319
337
  "title": "Domain",
320
338
  "type": "string"
321
339
  }
@@ -339,6 +357,7 @@
339
357
  "inputSchema": {
340
358
  "properties": {
341
359
  "record": {
360
+ "description": "The DMARC record text to validate, e.g. 'v=DMARC1; p=none; rua=mailto:reports@example.com'. The record value only \u2014 not the _dmarc hostname it is published at.",
342
361
  "title": "Record",
343
362
  "type": "string"
344
363
  }