bv-mcpBLOCK
Open-source DNS & email security scanner. One MCP endpoint, 57 checks, zero install. Cloudflare Workers.
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.
77236b48e3c9OBSERVED · 2026-10-10Connect
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 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]{
"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}"
}
}
}
}Exposed tools (9)
9 read · 0 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
attack-surface-assessment | read | Spoofability, lookalikes, shadow domain analysis |
domain | read | Domain to audit (e.g. example.com) |
email-auth-check | read | Email auth posture: SPF, DMARC, DKIM, MTA-STS |
email-hardening-guide | read | Email hardening plan with DNS record generation |
full-security-audit | read | DNS & email security audit with remediation |
minimum_grade | read | Min letter grade (default: |
policy-compliance-check | read | Check domain against security policy baseline |
provider-benchmark | read | Benchmark domain against email provider cohort |
remediation-workflow | read | Scan, plan fixes, generate DNS records |
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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
token alone is enough to post to the ops alert endpoint — on every deploy.
⚠️ **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
const res = await exec(sql, [...params], 'first');
all: async <T = unknown>(): Promise<D1Result<T>> => (await exec(sql, [...params], 'all')) as unknown as D1Result<T>,
run: async <T = unknown>(): Promise<D1Result<T>> => (await exec(sql, [...params], 'run')) as unknown as D1Result<T>,
exec(query: string): Promise<D1ExecResult> {exec(query: string): Promise<D1ExecResult>;
st, _, body = tool_call("check_ns", {"domain": "169.254.169.254", "format": "compact"}, sid, msg_id=50)log("PASS", "SSRF 169.254.169.254 blocked")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
tail.ts
print(f" Auth: {'API key validated' if API_KEY else 'unauthenticated (free tier)'}")console.log(` ${MCP_URL}?api_key=${rawKey}`);const baseUrl = __ENV.BV_LOAD_BASE_URL || 'http://127.0.0.1:8787';
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArmqcx2roHY0AGFBJ6QQldlX0e5/BQVCL9nQKNgJqPgjhSlRVuBJmGCI4vEAe5qLkgKRbZ5WxS0F9LRI+tgDlKZvmmv/Bh7BhqN9ZpKFdsQIg4odgUa0tCFg/V9cPlzDDFFgox77fDFcKf2os+ORqBunHmhJ
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdshfa2y3h7g/BJPSw9NHhxi6teky3b+WGfl+NdW/MaV7WYWaDcvNiUQxCtD5JJnY2o023hoAZbaZdXlA/DVCS+0SnULqObqPHUd9oSd+1cNu3RVi7HiygsxC+yA/htkz46fNRSqDHFUB3M5CF4IFnA3ZuT/5SX6O
padLeft('bucketsΔ', 10),padLeft('elapsedΔms', 11),const SECRET = 'my-secret-api-key-12345';
const TOKEN = 'chaos-bearer-token-abc123';
const SECRET = 'legacy-owner-proof-signing-secret-32-bytes-minimum';
['another signing key', () => mintToken(SUBJECT, { secret: 'different-signing-secret-32-bytes-minimum' }), () => currentTenantAuth()],expect(PRIVATE_KEY_HEADER_PATTERN.test('-----BEGIN PRIVATE KEY-----')).toBe(true);expect(PRIVATE_KEY_HEADER_PATTERN.test('-----BEGIN OPENSSH PRIVATE KEY-----')).toBe(true);const header = '-----BEGIN PRIVATE KEY-----';
Gates applied: critical_finding, no_behavioural_pass, undeclared_transfer.
77236b48e3c9full audit observations/trust-audit/mcp-server/madaburns__bv-mcp.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-10 | 77236b48e3c9 | BLOCK | F | 22 | first audit |
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.