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