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 CHANGED
@@ -9,7 +9,7 @@ Open-source DNS & email security scanner for Claude, Cursor, VS Code, and MCP cl
9
9
  [![GitHub stars](https://img.shields.io/github/stars/MadaBurns/bv-mcp?style=flat&logo=github)](https://github.com/MadaBurns/bv-mcp/stargazers)
10
10
  [![npm version](https://img.shields.io/npm/v/blackveil-dns)](https://www.npmjs.com/package/blackveil-dns)
11
11
  [![npm downloads](https://img.shields.io/npm/dm/blackveil-dns)](https://www.npmjs.com/package/blackveil-dns)
12
- [![Tests](https://img.shields.io/badge/Tests-1469-brightgreen)](https://github.com/MadaBurns/bv-mcp/actions)
12
+ [![Tests](https://img.shields.io/badge/Tests-1932-brightgreen)](https://github.com/MadaBurns/bv-mcp/actions)
13
13
  [![Coverage](https://img.shields.io/badge/Coverage-~90%25-brightgreen)](https://github.com/MadaBurns/bv-mcp/actions)
14
14
  [![BUSL-1.1 License](https://img.shields.io/badge/License-BUSL--1.1-blue.svg)](LICENSE)
15
15
  [![MCP](https://img.shields.io/badge/MCP-2025--03--26-blue)](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 33 tools available instantly.
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 SPF, DMARC, DKIM, and MTA-STS records
69
- - **Spoofability scoring** — `assess_spoofability` computes a composite 0-100 email spoofability score from SPF trust surface, DMARC enforcement, and DKIM coverage with interaction multipliers
70
- - **Intelligence layer** — `get_benchmark` and `get_provider_insights` expose anonymized aggregate insights from scan telemetry: percentile rankings, provider cohort comparisons, and 7-day trend analysis
71
- - **Multi-resolver consistency** — `check_resolver_consistency` queries 4 public DoH resolvers to detect GeoDNS, split-horizon DNS, or poisoning
72
- - **Interaction scoring** — correlated weaknesses (e.g., weak DKIM + permissive DMARC) receive additional penalties beyond individual finding scores
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 &rarr; blackveilsecurity.com](https://blackveilsecurity.com)**
99
-
100
- </div>
101
-
102
79
  ---
103
80
 
104
81
  ## Tools
105
82
 
106
83
  ```
107
- 33 MCP tools · 7 prompts · 6 resources
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 generate_mta_sts_policy
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
- ## npm package
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
- ```ts
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
- const candidate = 'example.com';
429
- const validation = validateDomain(candidate);
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
- if (!validation.valid) {
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
- const result = await scanDomain(candidate);
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
- <details>
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
- - Input sanitation and domain validation
581
- - Optional bearer-token authentication
582
- - Per-IP rate limiting (KV + in-memory fallback)
583
- - `check_lookalikes` capped at 20/day per IP with 60-min caching
584
- - `scan_domain` capped at 75/day per IP (results cached 5 min)
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
- ## Development
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
- ## Docs
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
- | Document | Path |
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
- ## Why
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
- One endpoint URL. No install. No API key. Point any MCP client at `https://dns-mcp.blackveilsecurity.com/mcp` and know where you stand.
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>