| v3.103.1 | ### Fixed - bv-ct-index: compaction cleanup no longer scans the whole runs catalog to check whether an R2 object is still referenced. Migration `0004_runs_r2_key.sql` adds an index on `runs.r2_key`; cleanup selection and the R2 deletion policy are unchanged (#1303). The migration is applied to the remote D1 database separately, before the sidecar deploy. ### Changed - Release tooling: `.claude/skills/bv-mcp-release/scripts/verify-release.sh <X.Y.Z>` replaces the hand-written post-deploy prob | High | 10/25/2026 |
| v3.101.1 | ### Changed - Dependencies: `@typesafe-ai/sdk` 0.6.0 โ 0.7.0 (#1287); codeql-action pins bumped (#1288). No scoring, detection or tool-surface change. | High | 10/23/2026 |
| v3.100.1 | Patch release: one wording fix in the OSINT report (#1270). `@blackveil/dns-checks` 1.60.2 and scoring model 1.40.0 are unchanged. ### Fixed - The `osint_investigation_report` detail sentence now says "at least N name(s)" for a floor-basis CT count. It printed "=N" in v3.100.0 because the output sanitiser replaces `>` with a space. | High | 10/20/2026 |
| v3.99.0 | ### Changed - `discover_subdomains` and the SAN correlator report the owned CT index (`bv-ct-index`, answering behind the `certstream` binding) honestly. A response carrying `coverage.source === 'bv-ct-index'` maps the `certstream` source to the new `historyWindow: 'forward-from'`, with `indexStartedAt` and `freshThrough` on the per-source coverage record and in the caveat ("owned CT index, names observed since <date>"). A legacy upstream with no `coverage` keeps `historyWindow: 'unknown'`. Di | High | 10/18/2026 |
| v3.98.3 | ### Fixed - Legacy SSE requests reject unavailable streams before dispatch and return completed responses if delivery fails after dispatch. - Tool result citations use the public scanner URL for domains outside the published report corpus (#1228). - Development dependencies resolve sharp 0.35.5 and patched Miniflare while preserving the nested Wrangler installs required by CF deployment tooling. | High | 10/11/2026 |
| dns-checks-v1.60.1 | Immutable scoring artifact. Consumers must verify the attached SHA-256 before installation. | High | 10/9/2026 |
| v3.98.1 | Release-gate fix. v3.98.0 was tagged but never deployed: its own `check:release-integrity` blocked the pinned deploy. v3.98.1 ships everything listed under 3.98.0 plus this fix. dns-checks 1.60.0 (unchanged; `dns-checks-v1.60.0` stays on the 3.98.0 commit); scoring model 1.40.0 (unchanged). ### Fixed - `check:release-integrity` read HEAD's tag with `git describe --tags --exact-match`, which returns only one tag; on a release commit that also carries the `dns-checks-v<version>` tag required by | High | 10/5/2026 |
| dns-checks-v1.59.0 | Immutable scoring artifact. Consumers must verify the attached SHA-256 before installation. | High | 10/4/2026 |
| v3.94.0 | ### Fixed - **The NXDOMAIN gate (#1128/#1152) now covers the composites and three more checks (SQ-268).** `assess_spoofability` and `simulate_attack_paths` ran SPF/DMARC/DKIM directly and reported a measured critical (spoofability about 100, feasible high/critical paths) for a name that does not exist. Both now probe the apex NS first, with the same predicate as `scan_domain` and the `check_*` tools: on a clean NXDOMAIN `assess_spoofability` returns its existing `evidenceInsufficient` shape (n | High | 10/3/2026 |
| v3.93.0 | ### Fixed - **`sendFuzzingAlert` no longer drops an unparseable `ALERT_WEBHOOK_URL` silently (SQ-205).** It now logs one `webhook_url_invalid` warning (URL length and scheme only, never the value), matching `sendAlert`. - **A `SESSION_STORE` (KV) or Durable Object coordinator outage on a valid bearer token now returns a retryable 503 on `/mcp`, not a 401 (SQ-234).** The JWT branch of `resolveTier` swallowed `StrongStateUnavailableError` and fell through to an unauthenticated result, | High | 9/29/2026 |
| v3.90.0 | ### Fixed - **An unrecognized cron trigger no longer runs the tenant sweep.** `routeCron` had no `'unknown'` route: any cron string that didn't match a named branch โ garbage, a typo in `wrangler.jsonc`, or a new trigger added before its dispatch branch โ fell into the same `'periodic'` fallback as the legitimate 15-minute sweep and silently ran `handleTenantCycleAlerts` plus the other periodic handlers, with no distinct log line (chaos SQ-193 H4). `routeCron` now maps only the act | High | 9/24/2026 |
| v3.87.0 | ### Added - **`check_authoritative_dns_infra` and `check_root_server_set` now issue real DNS-over-TCP queries** against a target's own nameservers (authoritative lane) and a rotating 3-of-13 sample of the root servers (root-server-set lane), instead of returning reference data or a provisioning stub. Measured when contact is proven by an AA=1 answer: UDP/TCP-53 reachability, the authoritative AA flag and recursion exposure, SOA-serial consistency, direct DNSKEY/RRSIG presence, EDNS0/ | High | 9/23/2026 |
| v3.86.1 | ### Fixed - **`check_authoritative_dns_infra` published 100 / passed for root-server hostnames that nothing had probed.** The `bv-infra-probe` sidecar's raw DNS lane issues no query, yet for a root hostname it returned `matchesOfficialHints: true`, `ipv4Ipv6Parity: true` and `ptrRecords: [hostname]` โ its static hints table compared with itself, and the input echoed back as its own PTR โ beside `live_raw_dns_probe_not_configured`. Three capabilities counted as passed, so the #696 `me | High | 9/21/2026 |
| v3.85.0 | ### Fixed - **`check_dnssec` no longer reports a DNSSEC defect it never measured.** When the primary resolver reports `AD=false` on a signed zone, the check asks Google DoH for a second opinion, because the AD flag is known to flap between resolver edge nodes. That confirmation helper returned a bare boolean, so "Google answered `AD=false`" and "Google never answered" (a non-2xx, a transport error, a timeout, or a body over the cap) were the same value. The caller cleared the finding | High | 9/20/2026 |
| v3.84.0 | ### Added - **The DoH response code (RCODE) is now available to callers of the DNS record helpers.** A DoH endpoint answers HTTP 200 for SERVFAIL and REFUSED exactly as it does for NOERROR, carrying the difference only in the JSON `Status` field โ so `queryDnsRecords`' `string[]` projection rendered "the resolver could not answer" byte-identically to "this name publishes no such record". A `_dmarc` SERVFAIL therefore reached the DMARC classifier as a measured absence, zeroing a Core | High | 9/20/2026 |
| v3.82.0 | Adds a seventh SGE control and the fail-soft TypeSafe/Jev client foundation, plus a round of attribution and brand-discovery correctness fixes. Scoring model stays at **1.34.0** and `@blackveil/dns-checks` at **1.49.0** (`PARITY_CORPUS_VERSION` in lockstep), so **bv-web-prod does not need to re-vendor for this release**. No weight, tier or grade band changed. ### Added - **A seventh SGE control: full sub-domain coverage** (#996, #1047). Extends `sge_quickscan`'s control set beyond the previ | High | 9/18/2026 |
| dns-checks-v1.49.0 | Immutable scoring artifact. Consumers must verify the attached SHA-256 before installation. | High | 9/15/2026 |
| v3.79.0 | Scoring model 1.29.0, `@blackveil/dns-checks` **1.44.0** (`PARITY_CORPUS_VERSION` in lockstep) โ bv-web-prod re-vendor required (it pins 1.36.0 today). No category weights or grade bands change, and no `SEVERITY_PENALTIES` entry moves. **Two changes in this block ARE score-bearing**, each with its own entry below: dns-checks **1.38.0** (#971, scoring model 1.26.0 โ DMARC partial enforcement) and dns-checks **1.43.0** (#989 โ the SPF `all`-term extraction reaching the finding path). One finding' | High | 9/13/2026 |
| v3.78.0 | Scoring model 1.25.0, `@blackveil/dns-checks` 1.37.0 (parity corpus 1.37.0). No category weights, grade bands or severity penalties change. ### Changed - **Vendor-neutral names for the registrar product-gap tooling and the brand-audit registrar view.** The registrar product-gap tools (`map_registrar_products`, internal-only, and `prioritize_portfolio_leads`) and the registrar-complement brand-audit view (`view='registrar_complement'`, wire version **2**, report IDs prefixed `reg_rpt_`; previo | High | 9/9/2026 |
| v3.70.0 | Evidence-fidelity release: every fix here stops a check from stating something it never measured. Supersedes 3.68.0/3.69.0/3.69.1, which were tagged but never deployed โ prod last served 3.67.0. ### Fixed - **check_ssl no longer reports "HTTPS and HSTS properly configured" for an apex it never measured.** An HTTPSโHTTPS redirect skipped HSTS analysis entirely, and the resulting empty finding set printed as a clean pass. HSTS on the redirect hop is now analyzed directly; when the hop carries n | High | 8/30/2026 |
| v3.52.0 | **No scoring-model change.** `SCORING_MODEL_VERSION` stays 1.10.0 and `@blackveil/dns-checks` stays 1.17.0 โ no weight, tier, grade band, severity penalty or profile rule moved. **Scores can move on non-apex hosts** because scan profile selection changed (see below). ### Fixed - `scan_domain`: non-apex hosts with no MX that inherit their zone (e.g. `www.example.com`) are now scored with the `web_only` profile instead of being penalized for absent SPF/DMARC/DKIM/MTA-STS the apex already govern | High | 8/17/2026 |
| v3.42.0 | **Scoring model 1.6.0 โ 1.7.0. `@blackveil/dns-checks` 1.10.0 โ 1.11.0** (package check behaviour changed, so `PARITY_CORPUS_VERSION` moves in lockstep and the bv-web-prod tarball needs re-vendoring). ### Changed - **Mailjet is now recognised in the core SPF trust-surface catalog.** The worker layer learned Mailjet in 3.36.x (#566 / #570), but the parity-locked core catalog did not โ so every DIRECT consumer of the published package under-counted the trust surface, reporting e.g. "2 shared pla | High | 8/4/2026 |
| v3.34.0 | ## [3.34.0] - 2026-07-24 Bugfix + scoring release: **non-apex scan targets no longer emit false "missing record" findings**. A subdomain that owns no zone of its own (normal DNS behaviour for undelegated labels โ e.g. a Mailgun/SendGrid sending host like `mg.ii.inc`) now inherits its zone apex's DNS posture instead of firing a spurious CRITICAL. Apex-domain scores are byte-identical. Scoring model bumped to **1.3.0**. ### Fixed - **NS false-positive on non-apex hostnames.** A scanned subdomai | High | 7/23/2026 |
| v3.29.9 | Patch release: **honest scanner identity + real robots.txt enforcement** across all target-facing checks. ### Fixed - **`@blackveil/dns-checks` (1.5.0): all target-facing checks (SSL, HTTP security, BIMI, MTA-STS, subdomain takeover) now send one consistent, real User-Agent (`BlackVeil-Security-Scanner/1.0`) and honor a target's `robots.txt` before fetching โ see `/bot-policy` on blackveilsecurity.com.** Previously the published bot-policy page described a scanner identity and opt-out mechani | High | 7/10/2026 |
| v3.26.0 | Minor release: the customer-facing letter grade on `scan_domain`, `batch_scan`, and `compare_domains` now uses the **NIST-aligned 6-band scale** (A+โฅ95, Aโฅ90, Bโฅ80, Cโฅ70, Dโฅ60, F<60), matching the BlackVeil web product so a domain shows ONE letter everywhere. **Scores are unchanged** โ only which letter a customer-facing scan surface displays. `SCORING_MODEL_VERSION` unchanged, tool count unchanged (79). `@blackveil/dns-checks` bumped to 1.4.0 (additive export). ### Changed - **Scan-output to | High | 6/29/2026 |
| v3.18.1 | Maintenance release: dependency bumps only. No scoring/scan change; `SCORING_MODEL_VERSION` unchanged; tool count unchanged (75). ### Changed - **Dependencies:** bump `tldts` 7.4.2 โ 7.4.3 (runtime โ public-suffix data refresh used by `src/lib/public-suffix.ts`). Dev tooling: Cloudflare group (`wrangler` 4.99 โ 4.101, `miniflare`/`workerd` to `20260616`), `vitest` 4.1.8 โ 4.1.9, `eslint` 10.4.1 โ 10.5.0, `typescript-eslint` 8.61.0 โ 8.61.1, `playwright` 1.60.0 โ 1.61.0 (#406โ#411). | High | 6/17/2026 |
| v3.18.0 | ### Security - **Internal:** add `agent-chat` caller principal (`X-BV-Caller: agent-chat`) with a server-side 13-tool read-only allowlist on `/internal/tools/{call,batch}`. Defense-in-depth for the bv-web agent feature โ non-allowlisted tools (mutating/offensive/identity) are rejected with `403 { "error": "agent_tool_not_allowed" }` even if the consuming gateway is bypassed. Alias-normalized before the check; audit-pinned (`agent-tool-allowlist.audit.test.ts`). | High | 6/10/2026 |
| v3.15.1 | Patch release: six bug fixes from an adversarial bug-hunt sweep, each gated behind a failing-before / passing-after test (#376). No tools added or removed (still 79); `SCORING_MODEL_VERSION` stays `1.2.0`. One scoring change is RFC-correctness (first item) with narrow, documented impact. ### Fixed - **SPF `redirect=` now counts toward the RFC 7208 ยง4.6.4 10-lookup budget** (`packages/dns-checks` `analyzeSpfLookupBudget`). It was excluded (citing ยง6.1's modifier classification), undercounting | High | 6/6/2026 |
| v3.5.0 | Scoring-contract recalibration aligning email-authentication and DNS-integrity severities with NIST SP 800-81r3, plus a new impersonation-aware DMARC escalation. Scores and finding severities shift for some domains โ see notes below. ### Changed - **DMARC and SPF severities recalibrated down to reflect standalone risk.** "No DMARC record found" is now **high** (was critical) and "DMARC policy set to none" is now **medium** (was high); SPF "Too many DNS lookups" (>10 lookups โ `PermError`) is | High | 5/30/2026 |
| v2.27.0 | ### Added - **Per-IP rate limit on `POST /oauth/register`** (#193) โ DCR was publicly reachable (`ENABLE_OAUTH=true`) with no per-IP gate. 10 registrations/min, 30/hr per `cf-connecting-ip`; returns HTTP 429 + `retry-after` header (OAuth 2.1 convention โ not MCP JSON-RPC `-32029`). KV fixed-window pattern mirrors `tokenRateExceeded` in `src/oauth/token.ts`. Legitimate first-time DCR usage is single-digit per IP per day, so 10/min absorbs retries without enabling enumeration. Resolves `TODO(pha | High | 5/23/2026 |
| v2.21.4 | ### Security - Removed tracked internal tenant and commercial planning documents from the public repository. - Scrubbed customer-placeholder references from docs, comments, and chaos output. - Tightened gitleaks coverage for customer-name placeholders while allowing timestamp-shaped SQL seed values. ### Changed - Restricted the root npm package publish surface to `dist`, `LICENSE`, and `README.md` so npm releases do not include repo internals, tests, scripts, workflows, docs, or build caches. | High | 5/16/2026 |
| v2.13.0 | Release 2.13.0 | High | 5/12/2026 |
| v2.10.2 | ### Fixed - **OAuth consent endpoint critical bug** โ endpoint required authentication before rendering consent page, causing 100% registration failure (302 redirects to `/sign-in` instead of showing consent form). Fixed by switching from `requireUserWithTenants` (throwing) to optional `getAuthenticatedUser` (non-throwing), allowing public access with two-state UI rendering. Verified live: HTTP 200, all 9 MCP clients passing, chaos test 58/58 (100%). Expected registration success improvement: 0 | High | 5/6/2026 |
| v2.10.1 | ### Fixed - **CI: Security workflow** โ replaced `gitleaks/gitleaks-action@v2` with a self-installed pinned binary (`gitleaks 8.30.1`). The repo's Actions allowlist (`patterns_allowed: ["MadaBurns/*"]`) had been silently rejecting the third-party action since 2026-04-22, causing every Security run to `startup_failure` with 0 jobs created. Replicates the action's incremental scan behavior โ PRs scan `base..head`, pushes scan `before..sha` (fallback `HEAD~1..HEAD` for fresh branches). ### Securi | High | 4/25/2026 |
| v2.9.2 | Release 2.9.2 | High | 4/21/2026 |
| v2.9.1 | ### Changed - **Dev dependencies**: bumped `wrangler` to `^4.83.0`. - **Repo tooling**: added `.intent/` workspace config and new harness scripts (`scripts/context-usage-test.py`, `scripts/conversation-sim.py`, `scripts/output-usage-test.py`) plus tranco scan-result snapshots under `scripts/`. Dev-only; no runtime or published-package impact. - **`.gitignore`**: removed duplicate `.mcp.json` entry. | High | 4/19/2026 |
| v2.9.0 | Release v2.9.0 | High | 4/19/2026 |
| v2.8.1 | ### Added - **Issue tracker triage automation** (`.github/workflows/triage-issues.yml`): on `issues: [opened, edited]`, matches six promotional-pattern regexes against title + body; applies `possibly-promotional` label and posts a single automated comment on initial open. Labels only โ never auto-closes โ so genuine feature requests aren't silently dropped. Workflow reads untrusted event payload fields via `env:` (no expression-injection risk). - **Issue template config** (`.github/ISSUE_TEMPLA | High | 4/18/2026 |
| v2.8.0 | ### Added - **`DohOutcome` discriminated type** (`src/lib/dns-types.ts`, `src/lib/dns-transport.ts`): DoH transport now returns a discriminated `{ kind: 'ok'; response } | { kind: 'error'; reason: 'timeout' | 'network' | 'parse' | 'http' }` outcome. Callers can distinguish transport failures from "no records" results. Legacy `DohResponse | null` shape still available via `toNullable()`. - **Unconfirmed secondary-resolver sentinel** (`src/lib/dns-transport.ts`): `confirmWithSecondaryResolvers` r | High | 4/18/2026 |
| v2.7.1 | ### Fixed - **`check_svcb_https` wire-format parsing** (`packages/dns-checks/src/checks/check-svcb-https.ts`): Cloudflare DoH JSON returns HTTPS (type 65) records in RFC 3597 wire format (`\# <length> <hex>`) rather than the human-readable presentation form. The previous regex-based parsers (`parseAlpn`, `hasEch`, `parsePriority`) only recognised presentation format, so every domain whose HTTPS record was resolved via Cloudflare DoH was incorrectly flagged with `HTTPS record missing ALPN parame | Medium | 4/13/2026 |
| v2.7.0 | ### Added - **7 new intelligence tools** inspired by [mclose/dns-mcp](https://github.com/mclose/dns-mcp), adapted for Cloudflare Workers: - `check_rbl` โ Check MX server IP reputation against 8 DNS-based Real-time Blocklists (Spamhaus ZEN, SpamCop, UCEProtect L1/L2, Mailspike, Barracuda, PSBL, SORBS) - `check_dbl` โ Check domain reputation against Spamhaus DBL, URIBL, and SURBL with bitmask return code decoding - `cymru_asn` โ Map domain IPs to Autonomous System Numbers via Team Cymru DNS | Medium | 4/13/2026 |
| v2.6.7 | ### Added - **Score Stability layers** โ three targeted mitigations for transient upstream variance that was causing repeat scans of the same domain to occasionally return different scores: - **DNSSEC AD flag confirmation probe** (`src/tools/check-dnssec.ts`): when the primary Cloudflare resolver reports "DNSSEC validation failing" (AD=false with DNSKEY+DS records present), a confirmation query is fired to Google DoH. If Google confirms AD=true, the check re-runs with the corrected flag. Reso | Medium | 4/10/2026 |
| v2.6.5 | Release 2.6.5 | Medium | 4/9/2026 |
| v2.3.5 | ### Fixed - **Lint error** โ removed unused `interactive` variable in tool handler introduced in v2.3.4. - **vite 8.0.4 โ 8.0.5** โ patched 3 high-severity CVEs (path traversal, fs.deny bypass, WebSocket file read). | Medium | 4/6/2026 |
| v2.3.2 | ### Added - **Expanded test coverage** โ new test files for tool handler dispatch, MCP execute flow, output sanitization, tool execution logging, and security audit assertions (+4,000 lines). - **Tranco benchmark scripts** โ `scripts/tranco-scan.mjs` (top-1000 scan) and `scripts/tranco-deep-scan.mjs` (29-tool deep analysis) for production performance benchmarking. ### Fixed - **Hardcoded API key removed** โ Tranco scripts now read `BV_API_KEY` from environment variable instead of embedding cre | Medium | 4/6/2026 |
| v2.2.1 | Release 2.2.1 | Medium | 4/5/2026 |
| v2.1.28 | Release 2.1.28 | Medium | 4/4/2026 |
| v2.1.27 | Release 2.1.27 | Medium | 4/4/2026 |
| v2.1.25 | Release 2.1.25 | Medium | 4/3/2026 |
| v2.1.24 | Release 2.1.24 | Medium | 4/3/2026 |
| v2.1.23 | Release 2.1.23 | Medium | 4/3/2026 |
| v2.1.22 | Release 2.1.22 | Medium | 4/1/2026 |
| v2.1.18 | Release v2.1.18 | Medium | 4/1/2026 |
| v2.1.17 | ### Changed - CLAUDE.md: documented `?api_key=` query param auth, SPF `~all` soft-fail downgrade rule, and Smithery listing/configSchema integration. | Medium | 4/1/2026 |
| v2.1.16 | ### Changed - Documentation: updated Claude Code API key setup to use `?api_key=` query parameter as primary method; added Smithery connection instructions; updated test count. | Medium | 4/1/2026 |
| v2.1.15 | Release 2.1.15 | Medium | 4/1/2026 |
| v2.1.14 | Release 2.1.14 | Medium | 4/1/2026 |
| v2.1.13 | Release 2.1.13 | Medium | 3/31/2026 |
| v2.1.12 | Release 2.1.12 | Medium | 3/31/2026 |
| v2.1.11 | Release 2.1.11 | Medium | 3/31/2026 |
| v2.1.10 | Release 2.1.10 | Medium | 3/30/2026 |
| v2.1.0 | ## What's New 8 new tools bringing the total to **41 MCP tools**. Major focus on intelligence, remediation, and compliance. ### New Intelligence Tools - **`resolve_spf_chain`** โ Recursive SPF include tree with DNS lookup counting against RFC 7208 10-lookup limit - **`discover_subdomains`** โ CT log subdomain discovery via `bv-certstream-worker` service binding (cached, no rate limiting) with crt.sh fallback - **`map_supply_chain`** โ Third-party dependency graph correlating SPF, NS, TXT verif | Medium | 3/30/2026 |
| v2.0.7 | ## Security Fixes All findings from the v2.0.6 security audit have been resolved. ### HIGH - **Method name reflection** (`dispatch.ts`) โ User-controlled JSON-RPC method names were reflected verbatim in error responses, creating an injection vector for downstream clients. Now uses static `'Method not found'` message. - **ReDoS in post-processing** (`post-processing.ts`) โ The regex `/(no\s+.+\s+record|...)/ ` in `isMissingRecordFinding()` contained a catastrophic backtracking pattern that cou | Medium | 3/26/2026 |
| v2.0.6 | ## Highlights - **Session hardening** โ Memory leak fix, ID format validation, re-initialize invalidation, legacy SSE stream cap - **Cache improvements** โ `force_refresh` + `cacheTtlSeconds` propagate to per-check caches, deferred scan cache writes - **Structured logging** โ All KV/DO fallback paths use `logError()` instead of `console.warn()`, visible to alerting pipeline - **Scoring accuracy** โ Maturity stage score-capping, DANE finding deduplication, BIMI non-mail domain text - **Security | Medium | 3/26/2026 |
| v1.4.3 | ## Highlights This release adds **intelligence features**, **guided remediation**, **interaction scoring**, and **context-optimized schemas** โ building on the v1.2.0 transport foundation. ### Intelligence Layer (Phase 2-3) - **`get_benchmark`** โ percentile rankings and 7-day trend analysis from anonymized scan telemetry - **`get_provider_insights`** โ provider cohort score comparisons - **`assess_spoofability`** โ composite 0-100 email spoofability score from SPF trust surface, DMARC enforce | Low | 3/21/2026 |
| v1.2.0 | ## What's New **Universal MCP transport support** โ three first-party transports, all driven by a single shared executor. ### Transport Matrix | Transport | Endpoint | Use Case | |-----------|----------|----------| | **Streamable HTTP** | `POST /mcp` | Modern MCP clients (VS Code, Cursor, Claude Code) | | **Native stdio** | `blackveil-dns-mcp` CLI | Local-only clients (Claude Desktop) | | **Legacy HTTP+SSE** | `GET /mcp/sse` + `POST /mcp/messages` | Older MCP clients | ### Highlights - **Sh | Low | 3/13/2026 |
| v1.0.0 | ## Blackveil DNS v1.0.0 Open-source DNS & email security scanner running on Cloudflare Workers. ### Features - **11 MCP tools**: SPF, DMARC, DKIM, DNSSEC, SSL/TLS, MTA-STS, NS, CAA, MX checks + full domain scan - **Subdomain takeover detection** with confidence-based verification - **0-100 security scoring** with letter grades (A+ through F) - **Plain-English explanations** using everyday analogies โ guest lists, wax seals, padlocks - **55+ detail-aware explanations** that match specific findi | Low | 3/8/2026 |