Atlas / MCP servers / madaburns / bv-mcp

bv-mcpBLOCK

mcp/madaburns/bv-mcp

Open-source DNS & email security scanner. One MCP endpoint, 57 checks, zero install. Cloudflare Workers.

Verdict
BLOCK
Grade
F
Trust score
22 /100
Exposed tools
9 9r · 0w · 0d
Transport
streamable-http
License
NOASSERTION
Stars
9
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Know where you stand.

Source-available DNS & email security scanner for Claude, Cursor, VS Code, and MCP clients across Streamable HTTP, stdio, and legacy HTTP+SSE.

[](https://github.com/MadaBurns/bv-mcp/stargazers) [](https://github.com/MadaBurns/bv-mcp/actions) [](LICENSE) [](https://modelcontextprotocol.io/) [](https://workers.cloudflare.com/) [](https://www.typescriptlang.org/) [](https://ko-fi.com/madaburns)

Try it in 30 seconds

Claude Desktop (one-click install):

Download the Blackveil DNS extension and open it — the current 81-tool surface is available instantly. Verify your download.

Claude Code (one command):

claude mcp add --transport http blackveil-dns https://dns-mcp.blackveilsecurity.com/mcp

Then ask: scan anthropic.com

Smithery (one command):

smithery mcp add MadaBurns/bv-mcp

Verify the endpoint is live:

curl https://dns-mcp.blackveilsecurity.com/health

No install. No API key. One URL for hosted HTTP:

Endpoint   https://dns-mcp.blackveilsecurity.com/mcp
Transport  Streamable HTTP · JSON-RPC 2.
Read from source at commit 77236b48e3c9OBSERVED · 2026-10-10
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add dns-checks --env BV_API_KEY=${BV_API_KEY} --env BV_DOH_TOKEN=${BV_DOH_TOKEN} --env BV_INTERNAL_DEV_KEY=${BV_INTERNAL_DEV_KEY} --env BV_INTERNAL_KEY=${BV_INTERNAL_KEY} -- npx -y @blackveil/[email protected]
claude-desktop
{
  "mcpServers": {
    "dns-checks": {
      "command": "npx",
      "args": [
        "-y",
        "@blackveil/[email protected]"
      ],
      "env": {
        "BV_API_KEY": "${BV_API_KEY}",
        "BV_DOH_TOKEN": "${BV_DOH_TOKEN}",
        "BV_INTERNAL_DEV_KEY": "${BV_INTERNAL_DEV_KEY}",
        "BV_INTERNAL_KEY": "${BV_INTERNAL_KEY}"
      }
    }
  }
}
03

Exposed tools (9)

9 read · 0 write · 0 destructive.

ToolRiskDescription
attack-surface-assessmentreadSpoofability, lookalikes, shadow domain analysis
domainreadDomain to audit (e.g. example.com)
email-auth-checkreadEmail auth posture: SPF, DMARC, DKIM, MTA-STS
email-hardening-guidereadEmail hardening plan with DNS record generation
full-security-auditreadDNS & email security audit with remediation
minimum_gradereadMin letter grade (default:
policy-compliance-checkreadCheck domain against security policy baseline
provider-benchmarkreadBenchmark domain against email provider cohort
remediation-workflowreadScan, plan fixes, generate DNS records
04

Trust audit

BLOCKgrade F · trust 22/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (7 observation(s))
Network
declared (8 observation(s))
Shell
declared (8 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

CRITICALPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
.claude/skills/bv-mcp-operations/SKILL.md:250
token alone is enough to post to the ops alert endpoint — on every deploy.
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
CRITICALPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
.claude/skills/bv-mcp-operations/SKILL.md:347
⚠️ **Its vantage is TLS-intercepted — nothing it returns about a certificate is origin-authentic (incident 2026-09-04, #906).** Browser Rendering egresses the browser through a TLS-terminating proxy t
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/tenants/d1-rest-client.ts:53
const res = await exec(sql, [...params], 'first');
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/tenants/d1-rest-client.ts:62
all: async <T = unknown>(): Promise<D1Result<T>> => (await exec(sql, [...params], 'all')) as unknown as D1Result<T>,
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/tenants/d1-rest-client.ts:63
run: async <T = unknown>(): Promise<D1Result<T>> => (await exec(sql, [...params], 'run')) as unknown as D1Result<T>,
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/tenants/d1-rest-client.ts:132
exec(query: string): Promise<D1ExecResult> {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/tenants/tenant-resolver.ts:130
exec(query: string): Promise<D1ExecResult>;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
scripts/chaos/chaos-test-v205.py:530
st, _, body = tool_call("check_ns", {"domain": "169.254.169.254", "format": "compact"}, sid, msg_id=50)
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
scripts/chaos/chaos-test-v205.py:536
log("PASS", "SSRF 169.254.169.254 blocked")
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHPrompt injection · prompt.credential_read · CWE-94, CWE-1427
.claude/skills/bv-mcp-release/SKILL.md:27
The consumer workflow still needs its own producer-read credential and repository settings that permit it to create a PR. Confirm download, integrity, all parity guards, typecheck and actual PR creati
Why it matters. asks the agent to read credentials
MEDIUMInventory / provenance · inv.binary · CWE-1104
src/tail.ts
tail.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/chaos/chaos-test-v210.py:1988
print(f"  Auth:   {'API key validated' if API_KEY else 'unauthenticated (free tier)'}")
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/trial-key.mjs:142
console.log(`   ${MCP_URL}?api_key=${rawKey}`);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/load/global-ceiling.k6.js:7
const baseUrl = __ENV.BV_LOAD_BASE_URL || 'http://127.0.0.1:8787';
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
packages/dns-checks/src/parity-fixtures.ts:552
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArmqcx2roHY0AGFBJ6QQldlX0e5/BQVCL9nQKNgJqPgjhSlRVuBJmGCI4vEAe5qLkgKRbZ5WxS0F9LRI+tgDlKZvmmv/Bh7BhqN9ZpKFdsQIg4odgUa0tCFg/V9cPlzDDFFgox77fDFcKf2os+ORqBunHmhJ
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
packages/dns-checks/src/parity-fixtures.ts:554
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdshfa2y3h7g/BJPSw9NHhxi6teky3b+WGfl+NdW/MaV7WYWaDcvNiUQxCtD5JJnY2o023hoAZbaZdXlA/DVCS+0SnULqObqPHUd9oSd+1cNu3RVi7HiygsxC+yA/htkz46fNRSqDHFUB3M5CF4IFnA3ZuT/5SX6O
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
scripts/brand-audit-planner-benchmark-summary.mjs:124
padLeft('bucketsΔ', 10),
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
scripts/brand-audit-planner-benchmark-summary.mjs:125
padLeft('elapsedΔms', 11),
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/auth.spec.ts:8
const SECRET = 'my-secret-api-key-12345';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/chaos/san-auth-degradation.chaos.test.ts:25
const TOKEN = 'chaos-bearer-token-abc123';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/legacy-brand-owner-proof.spec.ts:18
const SECRET = 'legacy-owner-proof-signing-secret-32-bytes-minimum';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/legacy-brand-owner-proof.spec.ts:98
['another signing key', () => mintToken(SUBJECT, { secret: 'different-signing-secret-32-bytes-minimum' }), () => currentTenantAuth()],
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/audits/no-tracked-secrets.audit.test.ts:125
expect(PRIVATE_KEY_HEADER_PATTERN.test('-----BEGIN PRIVATE KEY-----')).toBe(true);
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/audits/no-tracked-secrets.audit.test.ts:126
expect(PRIVATE_KEY_HEADER_PATTERN.test('-----BEGIN OPENSSH PRIVATE KEY-----')).toBe(true);
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
test/audits/repo-safety-scanner.audit.test.ts:40
const header = '-----BEGIN PRIVATE KEY-----';

Gates applied: critical_finding, no_behavioural_pass, undeclared_transfer.

Audited 2026-10-10 · audit v0.4.1 · source sha 77236b48e3c9full audit observations/trust-audit/mcp-server/madaburns__bv-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1077236b48e3c9BLOCKF22first audit
06

Questions

What is the bv-mcp MCP server?

Open-source DNS & email security scanner. One MCP endpoint, 57 checks, zero install. Cloudflare Workers.

What tools does bv-mcp expose?

9 in total: 9 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is bv-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (22/100) and found 10 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does bv-mcp need?

It reads BV_API_KEY, BV_DOH_TOKEN, BV_INTERNAL_DEV_KEY, BV_INTERNAL_KEY, BV_LOAD_TEST_KEY and BV_MCP_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does bv-mcp run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @blackveil/dns-checks at 1.60.1.

How current is this page?

The grade is for one exact copy of the source (77236b48e3c9), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement