blackveil-dns 2.0.10 → 2.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.
- package/README.md +54 -549
- package/dist/index.d.ts +52 -4
- package/dist/index.js +909 -3953
- package/dist/index.js.map +1 -1
- package/dist/stdio.js +8700 -9800
- package/dist/stdio.js.map +1 -1
- package/package.json +9 -3
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ Open-source DNS & email security scanner for Claude, Cursor, VS Code, and MCP cl
|
|
|
9
9
|
[](https://github.com/MadaBurns/bv-mcp/stargazers)
|
|
10
10
|
[](https://www.npmjs.com/package/blackveil-dns)
|
|
11
11
|
[](https://www.npmjs.com/package/blackveil-dns)
|
|
12
|
-
[](https://github.com/MadaBurns/bv-mcp/actions)
|
|
13
13
|
[](https://github.com/MadaBurns/bv-mcp/actions)
|
|
14
14
|
[](LICENSE)
|
|
15
15
|
[](https://modelcontextprotocol.io/)
|
|
@@ -24,6 +24,10 @@ Open-source DNS & email security scanner for Claude, Cursor, VS Code, and MCP cl
|
|
|
24
24
|
|
|
25
25
|
## Try it in 30 seconds
|
|
26
26
|
|
|
27
|
+
**Claude Desktop** (one-click install):
|
|
28
|
+
|
|
29
|
+
Download the [Blackveil DNS extension](https://github.com/MadaBurns/bv-claude-dns/releases/latest/download/bv-claude-dns.mcpb) and open it — all 41 tools available instantly. [Verify your download](https://blackveilsecurity.com/extensions/claude-dns#install).
|
|
30
|
+
|
|
27
31
|
**Claude Code** (one command):
|
|
28
32
|
|
|
29
33
|
```bash
|
|
@@ -32,6 +36,12 @@ claude mcp add --transport http blackveil-dns https://dns-mcp.blackveilsecurity.
|
|
|
32
36
|
|
|
33
37
|
Then ask: `scan anthropic.com`
|
|
34
38
|
|
|
39
|
+
**Smithery** (one command):
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
smithery mcp add MadaBurns/bv-mcp
|
|
43
|
+
```
|
|
44
|
+
|
|
35
45
|
**Verify the endpoint is live:**
|
|
36
46
|
|
|
37
47
|
```bash
|
|
@@ -52,8 +62,6 @@ Transport support:
|
|
|
52
62
|
- `Native stdio`: `blackveil-dns-mcp` CLI from the `blackveil-dns` npm package
|
|
53
63
|
- `Legacy HTTP+SSE`: `GET /mcp/sse` bootstrap stream plus `POST /mcp/messages?sessionId=...`
|
|
54
64
|
|
|
55
|
-
<!-- TODO: Add terminal demo GIF here -->
|
|
56
|
-
|
|
57
65
|
---
|
|
58
66
|
|
|
59
67
|
## What you get
|
|
@@ -61,46 +69,19 @@ Transport support:
|
|
|
61
69
|
- **57+ checks across 20 categories** — SPF, DMARC, DKIM, DNSSEC, SSL/TLS, MTA-STS, NS, CAA, MX, BIMI, TLS-RPT, subdomain takeover, lookalike domains, HTTP security headers, DANE, shadow domains, TXT hygiene, MX reputation, SRV, zone hygiene
|
|
62
70
|
- **Maturity staging** — Stage 0-4 classification (Unprotected to Hardened) with score-based capping to prevent inflated labels
|
|
63
71
|
- **Trust surface analysis** — detects shared SaaS platforms (Google, M365, SendGrid) and cross-references DMARC enforcement to determine real exposure
|
|
64
|
-
- **Guided remediation** — `generate_fix_plan` produces prioritized actions; record generators output ready-to-publish
|
|
65
|
-
- **
|
|
66
|
-
- **
|
|
67
|
-
- **
|
|
68
|
-
- **
|
|
69
|
-
- **Self-tuning scoring** — adaptive weights adjust category importance based on patterns seen across scans, so scores reflect real-world failure distributions rather than static assumptions
|
|
70
|
-
- **Provider intelligence** — inbound/outbound email provider inference from MX, SPF, DKIM
|
|
71
|
-
- **Context-optimized** — tool schemas, prompts, and resources are tuned for minimal token consumption in LLM clients
|
|
72
|
+
- **Guided remediation** — `generate_fix_plan` produces provider-aware prioritized actions; record generators output ready-to-publish records; `validate_fix` confirms whether a fix was applied successfully
|
|
73
|
+
- **Supply chain mapping** — `map_supply_chain` correlates DNS signals to build a full third-party dependency graph with trust levels and risk signals
|
|
74
|
+
- **Attack path simulation** — `simulate_attack_paths` enumerates specific paths (spoofing, takeover, hijack) with severity, steps, and mitigations
|
|
75
|
+
- **Compliance mapping** — `map_compliance` maps scan findings to NIST 800-177, PCI DSS 4.0, SOC 2, and CIS Controls
|
|
76
|
+
- **Self-tuning scoring** — adaptive weights adjust category importance based on patterns seen across scans via Durable Object telemetry
|
|
72
77
|
- **Passive and read-only** — all checks use public Cloudflare DNS-over-HTTPS; no authorization required from the target
|
|
73
78
|
|
|
74
|
-
Full scope and limitations in the coverage table below.
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
scan_domain("anthropic.com")
|
|
78
|
-
|
|
79
|
-
████████████████████████████████████████░░░░░ 85 / 100
|
|
80
|
-
Grade: A · Maturity: Enforcing
|
|
81
|
-
|
|
82
|
-
SPF ·········· 80 MTA-STS ····· 85
|
|
83
|
-
DMARC ········ 90 NS ·········· 95
|
|
84
|
-
DKIM ········· 85 CAA ········· 85
|
|
85
|
-
DNSSEC ······· 35 BIMI ········ 95
|
|
86
|
-
SSL ········· 100 TLS-RPT ····· 95
|
|
87
|
-
MX ·········· 100
|
|
88
|
-
|
|
89
|
-
2 high · 4 medium · 5 low · 5 info
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
<div align="center">
|
|
93
|
-
|
|
94
|
-
**[Scan your domain now → blackveilsecurity.com](https://blackveilsecurity.com)**
|
|
95
|
-
|
|
96
|
-
</div>
|
|
97
|
-
|
|
98
79
|
---
|
|
99
80
|
|
|
100
81
|
## Tools
|
|
101
82
|
|
|
102
83
|
```
|
|
103
|
-
|
|
84
|
+
41 MCP tools · 7 prompts · 6 resources
|
|
104
85
|
|
|
105
86
|
Email Auth Infrastructure Brand & Threats Meta
|
|
106
87
|
──────────── ──────────────── ───────────────── ──────────────
|
|
@@ -115,424 +96,32 @@ Full scope and limitations in the coverage table below.
|
|
|
115
96
|
──────────── check_srv get_provider_ generate_spf_record
|
|
116
97
|
check_txt_hygiene check_zone_hygiene insights generate_dmarc_record
|
|
117
98
|
check_resolver_ assess_spoofability generate_dkim_config
|
|
118
|
-
consistency
|
|
99
|
+
consistency map_supply_chain generate_mta_sts_policy
|
|
100
|
+
resolve_spf_chain generate_rollout_plan
|
|
101
|
+
discover_subdomains validate_fix
|
|
102
|
+
map_compliance
|
|
103
|
+
simulate_attack_paths
|
|
104
|
+
analyze_drift
|
|
119
105
|
|
|
120
106
|
+ check_subdomain_takeover (internal — runs inside scan_domain)
|
|
121
107
|
```
|
|
122
108
|
|
|
123
|
-
`explain_finding` takes any finding and returns: what it means, potential impact, adverse consequences, specific steps to fix, and relevant RFCs.
|
|
124
|
-
|
|
125
|
-
`generate_fix_plan` scans a domain and produces a prioritized remediation plan with effort, impact, and dependency metadata. The record generators (`generate_spf_record`, `generate_dmarc_record`, `generate_dkim_config`, `generate_mta_sts_policy`) produce ready-to-publish DNS records based on detected configuration.
|
|
126
|
-
|
|
127
|
-
`get_benchmark` and `get_provider_insights` expose anonymized aggregate data from scan telemetry — percentile rankings, provider cohort scores, and 7-day trend analysis. `assess_spoofability` computes a composite email spoofability score (0-100) from SPF, DMARC, and DKIM with interaction multipliers.
|
|
128
|
-
|
|
129
|
-
`check_resolver_consistency` queries Cloudflare, Google, Quad9, and OpenDNS in parallel to detect GeoDNS, split-horizon DNS, or potential poisoning.
|
|
130
|
-
|
|
131
|
-
**Confidence labels:**
|
|
132
|
-
`deterministic` — direct protocol/record validation | `heuristic` — signal-based inference, may need manual validation | `verified` — high-confidence validation signal
|
|
133
|
-
|
|
134
|
-
**Subdomain takeover verification:**
|
|
135
|
-
`potential` — DNS signal, requires proof-of-control | `verified` — deprovisioning fingerprint detected | `not_exploitable` — no takeover signal
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## Client setup
|
|
140
|
-
|
|
141
|
-
The free tier requires no authentication. If you have an API key, see the **With API key** tabs below to bypass rate limits.
|
|
142
|
-
|
|
143
|
-
<details>
|
|
144
|
-
<summary><b>VS Code / Copilot</b></summary>
|
|
145
|
-
|
|
146
|
-
`.vscode/mcp.json`
|
|
147
|
-
|
|
148
|
-
```json
|
|
149
|
-
{
|
|
150
|
-
"servers": {
|
|
151
|
-
"blackveil-dns": {
|
|
152
|
-
"type": "http",
|
|
153
|
-
"url": "https://dns-mcp.blackveilsecurity.com/mcp"
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
**With API key:**
|
|
160
|
-
|
|
161
|
-
```json
|
|
162
|
-
{
|
|
163
|
-
"servers": {
|
|
164
|
-
"blackveil-dns": {
|
|
165
|
-
"type": "http",
|
|
166
|
-
"url": "https://dns-mcp.blackveilsecurity.com/mcp",
|
|
167
|
-
"headers": {
|
|
168
|
-
"Authorization": "Bearer ${input:bv-api-key}"
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
},
|
|
172
|
-
"inputs": [
|
|
173
|
-
{
|
|
174
|
-
"id": "bv-api-key",
|
|
175
|
-
"type": "promptString",
|
|
176
|
-
"description": "Blackveil DNS API key",
|
|
177
|
-
"password": true
|
|
178
|
-
}
|
|
179
|
-
]
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
</details>
|
|
183
|
-
|
|
184
|
-
<details>
|
|
185
|
-
<summary><b>Claude Code</b></summary>
|
|
186
|
-
|
|
187
|
-
`.mcp.json`
|
|
188
|
-
|
|
189
|
-
```json
|
|
190
|
-
{
|
|
191
|
-
"mcpServers": {
|
|
192
|
-
"blackveil-dns": {
|
|
193
|
-
"type": "http",
|
|
194
|
-
"url": "https://dns-mcp.blackveilsecurity.com/mcp"
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Or via CLI:
|
|
201
|
-
|
|
202
|
-
```bash
|
|
203
|
-
claude mcp add --transport http blackveil-dns https://dns-mcp.blackveilsecurity.com/mcp
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
**With API key** — use `mcp-remote` to reliably forward the auth header:
|
|
207
|
-
|
|
208
|
-
```json
|
|
209
|
-
{
|
|
210
|
-
"mcpServers": {
|
|
211
|
-
"blackveil-dns": {
|
|
212
|
-
"command": "/opt/homebrew/bin/npx",
|
|
213
|
-
"args": [
|
|
214
|
-
"-y",
|
|
215
|
-
"mcp-remote",
|
|
216
|
-
"https://dns-mcp.blackveilsecurity.com/mcp",
|
|
217
|
-
"--header",
|
|
218
|
-
"Authorization: Bearer YOUR_API_KEY"
|
|
219
|
-
]
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
Or via CLI:
|
|
226
|
-
|
|
227
|
-
```bash
|
|
228
|
-
claude mcp add-json blackveil-dns \
|
|
229
|
-
'{"command":"npx","args":["mcp-remote","https://dns-mcp.blackveilsecurity.com/mcp","--header","Authorization: Bearer YOUR_API_KEY"]}'
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
> **Why `mcp-remote`?** Claude Code's native HTTP transport does not currently forward custom `headers` from config files. The `mcp-remote` bridge reliably passes the `Authorization` header to the server. Restart Claude Code after adding the server.
|
|
233
|
-
</details>
|
|
234
|
-
|
|
235
|
-
<details>
|
|
236
|
-
<summary><b>Claude Desktop</b></summary>
|
|
237
|
-
|
|
238
|
-
**Recommended:** Open [claude.ai](https://claude.ai) → **Settings → Connectors → Add custom connector** → paste `https://dns-mcp.blackveilsecurity.com/mcp`.
|
|
239
|
-
|
|
240
|
-
**With API key** — open **Settings → Developer → Edit Config** (`claude_desktop_config.json`) and add:
|
|
241
|
-
|
|
242
|
-
```json
|
|
243
|
-
{
|
|
244
|
-
"mcpServers": {
|
|
245
|
-
"blackveil-dns": {
|
|
246
|
-
"command": "npx",
|
|
247
|
-
"args": [
|
|
248
|
-
"mcp-remote",
|
|
249
|
-
"https://dns-mcp.blackveilsecurity.com/mcp",
|
|
250
|
-
"--header",
|
|
251
|
-
"Authorization: Bearer YOUR_API_KEY"
|
|
252
|
-
]
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Without API key (local stdio):** If you want first-party local stdio instead of the hosted HTTP connector:
|
|
259
|
-
|
|
260
|
-
```json
|
|
261
|
-
{
|
|
262
|
-
"mcpServers": {
|
|
263
|
-
"blackveil-dns": {
|
|
264
|
-
"type": "stdio",
|
|
265
|
-
"command": "/opt/homebrew/bin/npx",
|
|
266
|
-
"args": ["-y", "--package", "blackveil-dns", "blackveil-dns-mcp"]
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
> On macOS GUI apps, `npx` may not resolve from `PATH`; if Homebrew is installed elsewhere, replace `/opt/homebrew/bin/npx` with your actual `npx` path. After editing the config, fully restart Claude Desktop. If you already have other servers, merge `"blackveil-dns"` into your existing `"mcpServers"` object — don't paste a second `{ }` wrapper.
|
|
273
|
-
|
|
274
|
-
If you operate this Worker with bearer auth enabled, also register the same value as the production Worker secret:
|
|
275
|
-
|
|
276
|
-
```bash
|
|
277
|
-
npx wrangler versions secret put BV_API_KEY -c .dev/wrangler.deploy.jsonc
|
|
278
|
-
npx wrangler versions deploy -c .dev/wrangler.deploy.jsonc --yes
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
</details>
|
|
282
|
-
|
|
283
|
-
<details>
|
|
284
|
-
<summary><b>Cursor</b></summary>
|
|
285
|
-
|
|
286
|
-
`.cursor/mcp.json`
|
|
287
|
-
|
|
288
|
-
```json
|
|
289
|
-
{
|
|
290
|
-
"mcpServers": {
|
|
291
|
-
"blackveil-dns": {
|
|
292
|
-
"url": "https://dns-mcp.blackveilsecurity.com/mcp"
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
**With API key:**
|
|
299
|
-
|
|
300
|
-
```json
|
|
301
|
-
{
|
|
302
|
-
"mcpServers": {
|
|
303
|
-
"blackveil-dns": {
|
|
304
|
-
"url": "https://dns-mcp.blackveilsecurity.com/mcp",
|
|
305
|
-
"headers": {
|
|
306
|
-
"Authorization": "Bearer YOUR_API_KEY"
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
```
|
|
312
|
-
</details>
|
|
313
|
-
|
|
314
|
-
<details>
|
|
315
|
-
<summary><b>Windsurf</b></summary>
|
|
316
|
-
|
|
317
|
-
`~/.codeium/windsurf/mcp_config.json`
|
|
318
|
-
|
|
319
|
-
```json
|
|
320
|
-
{
|
|
321
|
-
"mcpServers": {
|
|
322
|
-
"blackveil-dns": {
|
|
323
|
-
"serverUrl": "https://dns-mcp.blackveilsecurity.com/mcp"
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
**With API key:**
|
|
330
|
-
|
|
331
|
-
```json
|
|
332
|
-
{
|
|
333
|
-
"mcpServers": {
|
|
334
|
-
"blackveil-dns": {
|
|
335
|
-
"serverUrl": "https://dns-mcp.blackveilsecurity.com/mcp",
|
|
336
|
-
"headers": {
|
|
337
|
-
"Authorization": "Bearer YOUR_API_KEY"
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
```
|
|
343
|
-
</details>
|
|
344
|
-
|
|
345
|
-
For hosted MCP setup, stdio usage, and legacy fallback endpoints, see `docs/client-setup.md`.
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
## CI/CD
|
|
350
|
-
|
|
351
|
-
Enforce DNS security grades in your pipeline with the [Blackveil DNS GitHub Action](https://github.com/MadaBurns/blackveil-dns-action):
|
|
352
|
-
|
|
353
|
-
```yaml
|
|
354
|
-
- uses: MadaBurns/blackveil-dns-action@v1
|
|
355
|
-
with:
|
|
356
|
-
domain: example.com
|
|
357
|
-
minimum-grade: B
|
|
358
|
-
profile: auto # or: mail_enabled, enterprise_mail, non_mail, web_only, minimal
|
|
359
|
-
api-key: ${{ secrets.BV_API_KEY }} # optional — bypasses rate limits
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
The action outputs `score`, `grade`, `maturity`, `scoring-profile`, and `passed` for downstream steps.
|
|
363
|
-
|
|
364
|
-
## Monitoring
|
|
365
|
-
|
|
366
|
-
Get weekly DNS security reports in Slack or Discord. See [`examples/slack-discord-webhook/`](examples/slack-discord-webhook/) for a ready-to-deploy Cloudflare Cron Trigger recipe.
|
|
367
|
-
|
|
368
109
|
---
|
|
369
110
|
|
|
370
|
-
##
|
|
111
|
+
## Quality & Reliability
|
|
371
112
|
|
|
372
|
-
|
|
113
|
+
The server is continuously validated using a **comprehensive chaos test suite** (ported from `claude-code-py`) that covers all 9 detected MCP client types:
|
|
373
114
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
| **Price** | $0 | $39/mo ($29/mo annual) | [Contact us](https://blackveilsecurity.com) |
|
|
377
|
-
| **Scans/day** | 75 | 500 | 10,000+ |
|
|
378
|
-
| **Checks/day** (per tool) | 200 | 5,000 | Unlimited |
|
|
379
|
-
| **Lookalike / Shadow scans** | 20/day | 200/day | Unlimited |
|
|
380
|
-
| **Rate limit** | 50 req/min | None | None |
|
|
381
|
-
| **API access** | Yes | Yes | Yes |
|
|
382
|
-
| **MCP access** | Yes | Yes | Yes |
|
|
383
|
-
| **GitHub Action** | Yes | Yes | Yes |
|
|
384
|
-
| **Batch API** | — | — | Up to 500 domains/call |
|
|
385
|
-
| **SLA** | Best effort | 99.5% | 99.9% + custom |
|
|
386
|
-
| **Support** | Community | Email | Dedicated |
|
|
115
|
+
- **Interactive clients**: `claude_code`, `cursor`, `vscode`, `claude_desktop`, `windsurf` (auto-format: `compact`)
|
|
116
|
+
- **Non-interactive clients**: `mcp_remote`, `blackveil_dns_action`, `bv_claude_dns_proxy`, `unknown` (auto-format: `full`)
|
|
387
117
|
|
|
388
|
-
The
|
|
118
|
+
The test suite ensures session stability, authentication precedence, and transport-specific edge cases across Streamable HTTP and Legacy SSE.
|
|
389
119
|
|
|
390
|
-
|
|
120
|
+
Run the chaos tests locally: `python3 scripts/chaos/chaos-test-clients.py`
|
|
391
121
|
|
|
392
122
|
---
|
|
393
123
|
|
|
394
|
-
##
|
|
395
|
-
|
|
396
|
-
Install from npm when you want to call the scanner from your own Node.js app, script, or service. If you are connecting from VS Code, Claude, Cursor, or another MCP client, use the MCP endpoint configuration above instead.
|
|
397
|
-
|
|
398
|
-
```bash
|
|
399
|
-
npm install blackveil-dns
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
Requirements: Node 18+ or another runtime with global `fetch`, `URL`, `AbortController`, and Web Platform APIs.
|
|
403
|
-
|
|
404
|
-
<details>
|
|
405
|
-
<summary><b>Usage example</b></summary>
|
|
406
|
-
|
|
407
|
-
```ts
|
|
408
|
-
import { scanDomain, explainFinding, formatScanReport, validateDomain } from 'blackveil-dns';
|
|
409
|
-
|
|
410
|
-
const candidate = 'example.com';
|
|
411
|
-
const validation = validateDomain(candidate);
|
|
412
|
-
|
|
413
|
-
if (!validation.valid) {
|
|
414
|
-
throw new Error(validation.error);
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const result = await scanDomain(candidate);
|
|
418
|
-
console.log(formatScanReport(result));
|
|
419
|
-
|
|
420
|
-
const guidance = explainFinding('SPF', 'fail', 'No SPF record found');
|
|
421
|
-
console.log(guidance.recommendation);
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
The npm package exports the reusable scanner API only. It does not start the MCP server or Cloudflare Worker entrypoint.
|
|
425
|
-
</details>
|
|
426
|
-
|
|
427
|
-
---
|
|
428
|
-
|
|
429
|
-
<details>
|
|
430
|
-
<summary><b>Coverage — 57+ checks across 20 categories</b></summary>
|
|
431
|
-
|
|
432
|
-
The full [BLACKVEIL](https://blackveilsecurity.com) platform extends each with deeper analytics.
|
|
433
|
-
|
|
434
|
-
| Category | Checks | MCP (Free) | Platform |
|
|
435
|
-
|---|---:|---|---|
|
|
436
|
-
| SPF | 8 | Policy and syntax validation | Include-chain and sender-path analytics |
|
|
437
|
-
| DMARC | 10 | Policy, pct, reporting, alignment | Subdomain inheritance, reporting quality |
|
|
438
|
-
| DKIM | 9 | Selector discovery, RSA key strength | Rotation heuristics, key-age drift |
|
|
439
|
-
| DNSSEC | 6 | AD validation, signed-zone baseline | Chain-of-trust, rollover posture |
|
|
440
|
-
| SSL/TLS | 8 | Certificate availability, validity | Protocol/cipher depth, renewal risk |
|
|
441
|
-
| MTA-STS | 5 | TXT policy, policy retrieval | Policy hardening, reporting depth |
|
|
442
|
-
| NS | 4 | Delegation, diversity, resiliency | Infrastructure concentration |
|
|
443
|
-
| CAA | 4 | Presence, issuer allowlist | Issuance surface modeling |
|
|
444
|
-
| MX | 4 | Presence, routing, provider inference | Mail routing posture |
|
|
445
|
-
| Subdomain Takeover | 2 | Dangling CNAME detection | Expanded asset discovery |
|
|
446
|
-
| BIMI | 1 | Record presence, logo URL, VMC | Brand indicator compliance |
|
|
447
|
-
| TLS-RPT | 1 | Record presence, reporting URI | Reporting depth |
|
|
448
|
-
| Lookalikes | 1 | Typosquat detection, DNS + MX probing | Expanded permutation strategies |
|
|
449
|
-
| HTTP Security | 7 | CSP, X-Frame-Options, COOP, CORP, Permissions-Policy | Header depth analytics |
|
|
450
|
-
| DANE | 3 | TLSA record validation for MX and HTTPS | Certificate pinning posture |
|
|
451
|
-
| Shadow Domains | 1 | Alternate-TLD email spoofing risk | Extended TLD coverage |
|
|
452
|
-
| TXT Hygiene | 1 | Stale verifications, SaaS exposure | Shadow IT discovery |
|
|
453
|
-
| MX Reputation | 1 | DNSBL + PTR/FCrDNS validation | Deliverability analytics |
|
|
454
|
-
| SRV | 1 | Service footprint discovery | Protocol exposure analytics |
|
|
455
|
-
| Zone Hygiene | 1 | SOA consistency, sensitive subdomains | Infrastructure exposure |
|
|
456
|
-
|
|
457
|
-
</details>
|
|
458
|
-
|
|
459
|
-
<details>
|
|
460
|
-
<summary><b>Scan output — anthropic.com (real, unedited)</b></summary>
|
|
461
|
-
|
|
462
|
-
```
|
|
463
|
-
BLACKVEIL DNS anthropic.com
|
|
464
|
-
─────────────────────────────────────────────────────────────────────
|
|
465
|
-
|
|
466
|
-
CATEGORY SCORE STATUS KEY FINDINGS
|
|
467
|
-
─────────────────────────────────────────────────────────────────────
|
|
468
|
-
SPF 80/100 PASS Soft fail (~all), Google shared
|
|
469
|
-
DMARC 90/100 PASS p=reject, relaxed alignment
|
|
470
|
-
DKIM 85/100 PASS google selector, 2048-bit RSA
|
|
471
|
-
DNSSEC 35/100 FAIL Not enabled — no DNSKEY/DS
|
|
472
|
-
SSL/TLS 100/100 PASS HTTPS + HSTS configured
|
|
473
|
-
MTA-STS 85/100 PASS No MTA-STS/TLS-RPT records
|
|
474
|
-
NS 95/100 PASS Cloudflare anycast
|
|
475
|
-
CAA 85/100 PASS No CAA records published
|
|
476
|
-
MX 100/100 PASS 5 MX records, Google Workspace
|
|
477
|
-
BIMI 95/100 PASS Eligible but not published
|
|
478
|
-
TLS-RPT 95/100 PASS No TLS-RPT record
|
|
479
|
-
─────────────────────────────────────────────────────────────────────
|
|
480
|
-
|
|
481
|
-
████████████████████████████████████████░░░░░ 85 / 100 Grade: A
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
### Findings
|
|
485
|
-
|
|
486
|
-
```
|
|
487
|
-
SEVERITY FINDING CATEGORY
|
|
488
|
-
─────────────────────────────────────────────────────────────────────────────
|
|
489
|
-
HIGH DNSSEC not validated — AD flag not set DNSSEC
|
|
490
|
-
HIGH No DNSKEY records found DNSSEC
|
|
491
|
-
MEDIUM No DS records — chain of trust broken DNSSEC
|
|
492
|
-
MEDIUM No MTA-STS or TLS-RPT records MTA-STS
|
|
493
|
-
MEDIUM No CAA records — any CA can issue certs CAA
|
|
494
|
-
MEDIUM DKIM RSA key below recommended (2048 < 4096) DKIM
|
|
495
|
-
LOW SPF soft fail (~all) — consider -all SPF
|
|
496
|
-
LOW Relaxed DKIM alignment (adkim=r) DMARC
|
|
497
|
-
LOW Relaxed SPF alignment (aspf=r) DMARC
|
|
498
|
-
LOW Low nameserver diversity (all Cloudflare) NS
|
|
499
|
-
LOW No BIMI record — eligible with p=reject BIMI
|
|
500
|
-
LOW No TLS-RPT record TLSRPT
|
|
501
|
-
INFO SPF delegates to shared platform: Google Workspace SPF
|
|
502
|
-
INFO DMARC properly configured (p=reject, sp=reject) DMARC
|
|
503
|
-
INFO MX records found (5 records) MX
|
|
504
|
-
INFO Inbound provider: Google Workspace MX
|
|
505
|
-
INFO HTTPS + HSTS properly configured SSL
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
**What this means.** Anthropic has strong email authentication — DMARC is set to `reject`, SPF and DKIM are present, Google Workspace handles mail. Because DMARC enforcement is strong, the shared-platform SPF delegation to Google stays informational rather than being flagged as a risk. The main gap is DNSSEC (DNS responses aren't cryptographically signed) and hardening opportunities around CAA, MTA-STS, and BIMI.
|
|
509
|
-
|
|
510
|
-
Run `explain_finding` on any result for plain-English remediation.
|
|
511
|
-
|
|
512
|
-
</details>
|
|
513
|
-
|
|
514
|
-
<details>
|
|
515
|
-
<summary><b>Protocol</b></summary>
|
|
516
|
-
|
|
517
|
-
| Method | Path | Purpose |
|
|
518
|
-
|---|---|---|
|
|
519
|
-
| `POST` | `/mcp` | JSON-RPC 2.0 tool/protocol requests (single or batch) |
|
|
520
|
-
| `GET` | `/mcp` | SSE stream for server notifications (requires session) |
|
|
521
|
-
| `DELETE` | `/mcp` | Session termination |
|
|
522
|
-
| `GET` | `/mcp/sse` | Legacy SSE bootstrap stream |
|
|
523
|
-
| `POST` | `/mcp/messages` | Legacy message delivery (requires `?sessionId=`) |
|
|
524
|
-
| `GET` | `/health` | Health probe |
|
|
525
|
-
| `POST` | `/internal/tools/call` | Service binding: single tool call (no auth/rate limits) |
|
|
526
|
-
| `POST` | `/internal/tools/batch` | Service binding: bulk scan up to 500 domains |
|
|
527
|
-
|
|
528
|
-
Supported methods: `initialize`, `ping`, `tools/list`, `tools/call`, `resources/list`, `resources/read`, `prompts/list`, `prompts/get`.
|
|
529
|
-
|
|
530
|
-
7 pre-built prompts guide common workflows: `full-security-audit`, `email-auth-check`, `policy-compliance-check`, `remediation-workflow`, `email-hardening-guide`, `provider-benchmark`, `attack-surface-assessment`.
|
|
531
|
-
|
|
532
|
-
</details>
|
|
533
|
-
|
|
534
|
-
<details>
|
|
535
|
-
<summary><b>Architecture</b></summary>
|
|
124
|
+
## Architecture
|
|
536
125
|
|
|
537
126
|
```
|
|
538
127
|
MCP Client
|
|
@@ -554,124 +143,44 @@ Supported methods: `initialize`, `ping`, `tools/list`, `tools/call`, `resources/
|
|
|
554
143
|
└───┬──────────────────────┘
|
|
555
144
|
│
|
|
556
145
|
┌───▼──────────────────────┐
|
|
146
|
+
│ Generic Scoring Engine │
|
|
147
|
+
│ Three-tier model │
|
|
148
|
+
└───┬──────────────────────┘
|
|
149
|
+
│
|
|
150
|
+
┌───▼──────────────────────┐
|
|
557
151
|
│ Cloudflare DoH │
|
|
558
152
|
│ DNS-over-HTTPS │
|
|
559
153
|
└──────────────────────────┘
|
|
560
154
|
```
|
|
561
155
|
|
|
562
|
-
-
|
|
563
|
-
-
|
|
564
|
-
-
|
|
565
|
-
-
|
|
566
|
-
-
|
|
567
|
-
- Scan result caching (KV + in-memory fallback)
|
|
568
|
-
- Adaptive scoring via Durable Object telemetry (graceful fallback to static weights)
|
|
569
|
-
- Intelligence layer: score histograms, provider cohort benchmarks, hourly trend snapshots (ProfileAccumulator DO)
|
|
570
|
-
- Category interaction scoring: correlated weaknesses receive additional penalties
|
|
571
|
-
- Context-optimized schemas: tool descriptions, prompts, and resources tuned for minimal LLM token consumption
|
|
572
|
-
- Structured JSON logging
|
|
573
|
-
|
|
574
|
-
Implementation details in `CLAUDE.md`.
|
|
575
|
-
|
|
576
|
-
</details>
|
|
577
|
-
|
|
578
|
-
<details>
|
|
579
|
-
<summary><b>Security</b></summary>
|
|
580
|
-
|
|
581
|
-
Full details in `CLAUDE.md` (security and observability sections).
|
|
582
|
-
|
|
583
|
-
- Domain inputs validated and sanitized before execution
|
|
584
|
-
- IP literals rejected (standard and alternate numeric forms)
|
|
585
|
-
- SSRF protections block unsafe/private targets
|
|
586
|
-
- Error responses sanitized — only known validation errors surface
|
|
587
|
-
- DNS via Cloudflare DoH with optional secondary confirmation
|
|
588
|
-
- Constant-time auth comparison (XOR accumulation on SHA-256 digests)
|
|
589
|
-
- DNS data sanitized at ingestion — HTML/markdown injection stripped before findings are created
|
|
590
|
-
- Outbound response body caps (64 KB for tool checks, 1 MB for provider signatures)
|
|
591
|
-
- Tool parameter validation with allowlists and per-element type/length checks
|
|
592
|
-
- Rate limits: `50/min` and `300/hr` per IP for `tools/call` (free tier; Pro and Enterprise bypass)
|
|
593
|
-
- Control-plane traffic: `60/min` and `600/hr` per IP
|
|
594
|
-
- Global daily cap: `500,000` unauthenticated tool calls/day (cost ceiling)
|
|
595
|
-
- Authenticated requests: per-tier daily quotas keyed by API key hash (see [Pricing](#pricing))
|
|
596
|
-
- Session creation: `60/min` per IP (enforced on both modern and legacy transports)
|
|
597
|
-
- Session TTL: 2 hours idle, dual-write (KV + in-memory) for cross-isolate resilience
|
|
598
|
-
- SSE notification stream exempt from rate limiting (prevents `mcp-remote` reconnection storms)
|
|
599
|
-
- Client IPs redacted in structured logs
|
|
600
|
-
|
|
601
|
-
**Natural-language convenience:**
|
|
602
|
-
`tools/call` supports `scan` as an alias for `scan_domain`. In chat clients, say `scan example.com`. Raw JSON-RPC expects `params.name` to be `scan` or `scan_domain`.
|
|
603
|
-
|
|
604
|
-
</details>
|
|
605
|
-
|
|
606
|
-
<details>
|
|
607
|
-
<summary><b>Provider detection</b></summary>
|
|
608
|
-
|
|
609
|
-
`check_mx` and `scan_domain` infer managed email providers.
|
|
610
|
-
|
|
611
|
-
- **Inbound** — MX host matching
|
|
612
|
-
- **Outbound** — SPF include/redirect signals + DKIM selector hints
|
|
613
|
-
- Metadata: `detectionType`, `providers`, `providerConfidence` (0.0-1.0), `signatureSource`, `signatureVersion`
|
|
614
|
-
- Fallback order: runtime source -> stale cache -> built-in signatures
|
|
615
|
-
|
|
616
|
-
Optional configuration:
|
|
617
|
-
|
|
618
|
-
| Variable | Purpose |
|
|
619
|
-
|---|---|
|
|
620
|
-
| `PROVIDER_SIGNATURES_URL` | Runtime provider-signature JSON source |
|
|
621
|
-
| `PROVIDER_SIGNATURES_SHA256` | Required pinned digest |
|
|
622
|
-
| `PROVIDER_SIGNATURES_ALLOWED_HOSTS` | Hostname allowlist |
|
|
623
|
-
|
|
624
|
-
</details>
|
|
156
|
+
- **Generic Scoring Engine**: Architectural core ported from `claude-code-py` for cross-language consistency
|
|
157
|
+
- **WASM Policy Engine**: High-performance permission and token checks via `bv-wasm-core`
|
|
158
|
+
- **Reliable Sessions**: Hardened tombstone logic prevents race-condition revival of terminated sessions
|
|
159
|
+
- **Adaptive Scoring**: Durable Object telemetry adjusts weights based on real-world distributions
|
|
160
|
+
- **Client Awareness**: Automatic response formatting (`compact` vs `full`) based on client `User-Agent`
|
|
625
161
|
|
|
626
162
|
---
|
|
627
163
|
|
|
628
|
-
##
|
|
629
|
-
|
|
630
|
-
```bash
|
|
631
|
-
git clone https://github.com/MadaBurns/bv-mcp.git
|
|
632
|
-
cd bv-mcp
|
|
633
|
-
npm install
|
|
634
|
-
npm run dev # localhost:8787/mcp
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
```bash
|
|
638
|
-
npm test # 1469 tests
|
|
639
|
-
npm run typecheck
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
<details>
|
|
643
|
-
<summary><b>Private deployment</b></summary>
|
|
644
|
-
|
|
645
|
-
```bash
|
|
646
|
-
cp wrangler.private.example.jsonc .dev/wrangler.deploy.jsonc
|
|
647
|
-
# replace KV namespace IDs and analytics dataset in .dev/wrangler.deploy.jsonc
|
|
648
|
-
npm run deploy:private
|
|
649
|
-
```
|
|
650
|
-
|
|
651
|
-
The checked-in [wrangler.jsonc](wrangler.jsonc) stays generic for open source use. Real KV IDs, session storage, and Analytics Engine dataset names should live only in the ignored `.dev/wrangler.deploy.jsonc` file.
|
|
652
|
-
|
|
653
|
-
</details>
|
|
654
|
-
|
|
655
|
-
Manual request examples and failure modes in `docs/troubleshooting.md`.
|
|
656
|
-
|
|
657
|
-
---
|
|
164
|
+
## Client setup
|
|
658
165
|
|
|
659
|
-
|
|
166
|
+
The free tier requires no authentication. If you have an API key, you can use either:
|
|
167
|
+
- **Header**: `Authorization: Bearer <KEY>`
|
|
168
|
+
- **Query Param**: `?api_key=<KEY>`
|
|
660
169
|
|
|
661
|
-
|
|
662
|
-
|---|---|
|
|
663
|
-
| Client setup | `docs/client-setup.md` |
|
|
664
|
-
| Scoring | `docs/scoring.md` |
|
|
665
|
-
| Troubleshooting | `docs/troubleshooting.md` |
|
|
666
|
-
| Style guide | `docs/style-guide.md` |
|
|
170
|
+
For full hosted setup examples, stdio usage, and legacy fallback endpoints, see [**docs/client-setup.md**](docs/client-setup.md).
|
|
667
171
|
|
|
668
172
|
---
|
|
669
173
|
|
|
670
|
-
##
|
|
671
|
-
|
|
672
|
-
Most DNS and email security tools are paywalled dashboards or CLI scripts that need local setup. Neither works inside an AI assistant where you want to check a domain mid-conversation.
|
|
174
|
+
## Pricing
|
|
673
175
|
|
|
674
|
-
|
|
176
|
+
| | **Free** | **Pro** | **Enterprise** |
|
|
177
|
+
|---|---|---|---|
|
|
178
|
+
| **Price** | $0 | $39/mo | [Contact us](https://blackveilsecurity.com) |
|
|
179
|
+
| **Scans/day** | 75 | 500 | 10,000+ |
|
|
180
|
+
| **Checks/day** | 200 | 5,000 | Unlimited |
|
|
181
|
+
| **Rate limit** | 50 req/min | None | None |
|
|
182
|
+
| **API access** | Yes | Yes | Yes |
|
|
183
|
+
| **MCP access** | Yes | Yes | Yes |
|
|
675
184
|
|
|
676
185
|
---
|
|
677
186
|
|
|
@@ -679,10 +188,6 @@ One endpoint URL. No install. No API key. Point any MCP client at `https://dns-m
|
|
|
679
188
|
|
|
680
189
|
Built and maintained by [**BLACKVEIL**](https://blackveilsecurity.com) — NZ-owned cybersecurity consultancy.
|
|
681
190
|
|
|
682
|
-
Featured in [SecurityBrief](https://securitybrief.co.nz/story/exclusive-how-cybersecurity-startup-blackveil-is-targetting-ai-driven-threats) · [NZ Herald](https://www.nzherald.co.nz/video/herald-now/ryan-bridge-today/cybersecurity-medimap-hack/OMLGW3OMXOVSSJ3RLFXPMAVGKE/) · [Modern Cyber](https://www.youtube.com/watch?v=W4aJHpfB5rY)
|
|
683
|
-
|
|
684
|
-
Want continuous monitoring? [BLACKVEIL](https://blackveilsecurity.com) provides real-time alerting and Buck AI to help you fix what this scanner finds.
|
|
685
|
-
|
|
686
191
|
BUSL-1.1 License (converts to MIT on 2030-03-17)
|
|
687
192
|
|
|
688
193
|
</div>
|