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 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/)
@@ -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 SPF, DMARC, DKIM, and MTA-STS records
65
- - **Spoofability scoring** — `assess_spoofability` computes a composite 0-100 email spoofability score from SPF trust surface, DMARC enforcement, and DKIM coverage with interaction multipliers
66
- - **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
67
- - **Multi-resolver consistency** — `check_resolver_consistency` queries 4 public DoH resolvers to detect GeoDNS, split-horizon DNS, or poisoning
68
- - **Interaction scoring** — correlated weaknesses (e.g., weak DKIM + permissive DMARC) receive additional penalties beyond individual finding scores
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 &rarr; blackveilsecurity.com](https://blackveilsecurity.com)**
95
-
96
- </div>
97
-
98
79
  ---
99
80
 
100
81
  ## Tools
101
82
 
102
83
  ```
103
- 33 MCP tools · 7 prompts · 6 resources
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 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
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
- ## Pricing
111
+ ## Quality & Reliability
371
112
 
372
- Full API and MCP access at every tier no enterprise gatekeeping.
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
- | | **Free** | **Pro** | **Enterprise** |
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 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.
118
+ The test suite ensures session stability, authentication precedence, and transport-specific edge cases across Streamable HTTP and Legacy SSE.
389
119
 
390
- Get an API key at [blackveilsecurity.com](https://blackveilsecurity.com).
120
+ Run the chaos tests locally: `python3 scripts/chaos/chaos-test-clients.py`
391
121
 
392
122
  ---
393
123
 
394
- ## npm package
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
- - Input sanitation and domain validation
563
- - Optional bearer-token authentication
564
- - Per-IP rate limiting (KV + in-memory fallback)
565
- - `check_lookalikes` capped at 20/day per IP with 60-min caching
566
- - `scan_domain` capped at 75/day per IP (results cached 5 min)
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
- ## Development
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
- ## 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>`
660
169
 
661
- | Document | Path |
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
- ## Why
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
- 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 |
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>