NEL VEIL MCP Server

Free domain security scanning for AI agents. Ask your agent whether a domain can be email-spoofed, and get a real answer in about ten seconds.

Nine tools. No port scanning, no exploit testing. No API key, no signup.

Install it in about a minute

You need Node 18 or newer and an AI client that speaks MCP. There is no account to create and no key to paste. The four steps below are the whole thing.

1

Add the server to your client

If you use Claude Code, this one command is the entire install. Run it in a terminal:

claude mcp add nel-veil -- npx -y nel-veil-mcp

Every other client is configured with a file instead. Copy this block into it:

{
  "mcpServers": {
    "nel-veil": {
      "command": "npx",
      "args": ["-y", "nel-veil-mcp"]
    }
  }
}

If the file already has an mcpServers section, put the "nel-veil" entry inside it rather than pasting a second mcpServers block. Two of them is invalid JSON, and most clients respond to that by loading no servers at all without saying why.

2

Put it in the file your client actually reads

ClientWhere the config livesTop-level key
Claude CodeNothing to edit; the command above writes it for youn/a
Claude DesktopSettings → Developer → Edit ConfigmcpServers
CursorSettings → MCP → Add new server, or ~/.cursor/mcp.jsonmcpServers
WindsurfSettings → MCP, or ~/.codeium/windsurf/mcp_config.jsonmcpServers
VS Code (Copilot agent mode).vscode/mcp.json in your projectservers
Anything elseIts own MCP settings screen, or the config file it documentsmcpServers

VS Code is the odd one out: its key is servers, not mcpServers, so the block above will not load there. Use this instead:

.vscode/mcp.json

{
  "servers": {
    "nel-veil": {
      "command": "npx",
      "args": ["-y", "nel-veil-mcp"]
    }
  }
}

Clients do move these paths between releases. If yours has an “Add MCP server” screen, prefer it over editing a file by hand, since it writes to whatever location that version expects.

3

Restart the client, properly

Nearly every MCP client reads its server list once, at startup, so a config change does nothing until it restarts. Closing the window is often not enough, because on Windows and macOS the app can keep running in the tray or menu bar. Quit it fully, then reopen.

The first run downloads the package, so it may take a few seconds longer than later ones. After that npx serves it from cache.

4

Ask it something

You do not call the tools yourself. You ask in plain language and the assistant picks the right one. A good first test:

Check if example.com can be email-spoofed.

That runs check_email_spoofing and comes back with something like this:

Check if a domain can be email-spoofed: example.com
Score: 100/100 (done)

2 findings:
  [LOW] DMARC has no reporting address (rua/ruf), you have no
        visibility into spoofing
  [LOW] DKIM key may be 1024-bit (weak), 2048-bit recommended

Other things worth asking:

  • Run a full security scan on my domain and tell me what to fix first.
  • Does stripe.com have HSTS and a content security policy?
  • Is anything exposed at github.com that shouldn't be?
  • Check our five supplier domains for DMARC and rank them worst to best.

If something goes wrong

I edited the config and the tools still don't appear

Almost always the restart. Clients read their server list once at startup, and closing the window is not always quitting the app. On Windows and macOS it can stay alive in the tray or menu bar. If a full restart does not fix it, check the JSON parses: a single trailing comma disables the entire file, and most clients respond by loading no servers at all rather than reporting the error.

'npx is not recognised' or 'node: command not found'

Node is not installed, or not on your PATH. Install Node 18 or newer from nodejs.org, then open a new terminal. An already-open one keeps the old PATH and will keep failing. Running node -v should print v18 or higher.

I ran npx -y nel-veil-mcp myself and it just sits there

That is correct behaviour, not a hang. It is a stdio server rather than a command-line tool: it prints one ready line to stderr and then waits for a client to speak JSON-RPC on stdin. Nothing else is ever written to stdout, because stdout carries the protocol. Press Ctrl-C to stop it. The ready line is your confirmation that it installed and starts.

It says I've been rate limited

The free tier allows ten single checks and three full scans per minute, per IP address. Wait a minute and continue. There is no key that raises it: the limit is what keeps the tier free and open to everyone.

'Could not check <domain>'

Check what you actually passed. example.com, www.example.com and https://example.com/path are all accepted and normalise to the same domain, and so is a public IP address, which is allowed on purpose so you can check an origin server directly. An email address is not rejected either: only the domain part is used, so you@example.com is checked as example.com. What IS refused is a private or reserved address (127.0.0.1, 10.x, 192.168.x, 169.254.169.254 and the rest), a name with no TLD such as localhost, and an IPv6 literal. The private ranges are refused deliberately: this server will not be used to probe internal networks.

Still stuck? The source is on GitHub and issues opened there are read. For anything else, get in touch.

Tools

ToolAnswers
check_email_spoofingCan someone send email that appears to come from this domain? Checks DMARC, SPF and DKIM.
check_tlsIs this domain's certificate valid and current, and is the connection negotiating a modern protocol? One ordinary TLS handshake, read for issuer, expiry, hostname match and the negotiated protocol and cipher.
check_security_headersDoes this site send the headers that protect visitors in the browser? CSP, HSTS and the rest.
check_exposed_filesIs this domain publicly serving files it should not be?
check_subdomain_takeoverAre there DNS records pointing at services someone else could claim?
scan_domainEverything above at once, with a per-module score, plus a check for publicly reachable admin panels.
get_scan_reportRetrieve a scan already run on nelprofessional.com by its id.
list_compliance_frameworksWhich laws and standards can this be checked against, and which can it not? The full register of 102 frameworks across Canada, the US, the EU, the UK, Asia-Pacific, Africa and the global standards, each marked as externally assessable or not.
check_complianceWhat do this domain's public-facing findings suggest about alignment with GDPR, NIS2, PIPEDA, CCPA, ISO 27001, SOC 2 and the rest? One passive scan mapped onto the register, with the provision each finding bears on and, on every framework, how many of the relevant checks actually ran.

What this sends, stated plainly

Being precise here matters more than sounding safe, because this is the paragraph you rely on when deciding whether you may point a tool at someone else's domain.

No tool does port scanning or exploit testing. Those are genuinely intrusive, they need the domain owner's permission, and they are deliberately not exposed over MCP at all.

But “passive” is not the same as “invisible”, and some checks do more than read public records:

  • check_tls opens one connection. It makes a single ordinary TLS handshake to port 443 from NEL's own infrastructure and reads what the server presents: certificate issuer and subject, the validity window and expiry, subject alternative names, and the negotiated protocol and cipher. Nothing else is contacted. It reports expired certificates, ones expiring within 14 or 30 days, self-signed certificates, untrusted chains, hostname mismatches and a negotiated TLS 1.0 or 1.1. One handshake shows only what the server chose for that connection, so it cannot tell you every protocol or cipher the server would also accept, and it does not test for Heartbleed, POODLE, DROWN or RC4 support. There is no letter grade here: the deep assessment that produces a Qualys SSL Labs grade is a separate active module, tls_labs, which runs only at nelprofessional.com after a DNS TXT record proves you control the domain, and it is not reachable over MCP.
  • check_subdomain_takeover is not DNS-only. It resolves a small fixed list of common subdomain names and makes one HTTPS request to any that point at a known cloud host. It never claims or modifies anything.
  • check_exposed_files requests a small fixed list of well-known paths (.env, .git/config). It never brute-forces or fuzzes, but these are paths a crawler would not request.
  • scan_domain runs all of the above, and also checks whether common admin panels (/phpmyadmin/, /manager/html) are publicly reachable.

All of it is information the domain publishes, and none of it attacks anything, but it is more than ordinary crawling and is recognisable in a target's logs as a security check. Prefer running it against a domain you own or are authorised to assess.

NEL VEIL does offer active scanning. It lives on the web app, where you prove you control the domain with a DNS TXT record first. Run a full scan on a domain you own →

Rate limits: ten single checks and three full scans per minute, per IP address. The package sends no API key, no email address and no account identifier. Each request carries the domain you asked about and a nel-veil-mcp user-agent. As with any HTTP service, NEL sees the originating IP; that is what the rate limit is keyed on.

Frequently asked questions

What is the NEL VEIL MCP server?

NEL VEIL MCP is a free Model Context Protocol server that gives AI agents nine tools for checking a domain's public security posture: email spoofing (DMARC/SPF/DKIM), certificate validity and expiry read from a single direct TLS handshake, HTTP security headers, publicly exposed files, subdomain-takeover risk, a combined scan, retrieval of an earlier scan, and compliance readiness against a register of 102 global frameworks. It installs with one command and needs no API key.

Is check_compliance a compliance audit?

No. It reports readiness signals from public-surface evidence only, and it is built so an agent cannot overstate them. Every framework carries a coverage figure — how many of the scan categories it relies on were actually observed, such as 9 of 16. A framework whose relevant checks did not run has no score and is marked Not assessed, which means unknown, not clean. A clean result over fewer than half a framework's categories is marked Partial rather than Strong. And 26 of the 102 entries — anti-money-laundering rules, consumer-protection statutes, criminal offences provisions, securities disclosure rules — impose no technical safeguard an external scan could ever evidence, so they are listed and explained but never scored. None of it is a certification or legal advice; each framework also notes what it requires that no external scan can see.

How do I install the NEL VEIL MCP server?

In Claude Code, run: claude mcp add nel-veil -- npx -y nel-veil-mcp. In any other MCP client, add a server entry with command npx and args -y and nel-veil-mcp. It requires Node 18 or newer.

Does it cost anything or need an API key?

No. Every tool is free and needs no API key, no signup and no account. The free tier is rate limited per IP address to ten single checks and three full scans per minute.

Is it safe to scan a domain I do not own?

There is no port scanning and no exploit testing, and nothing here attacks anything: every result is built from information the domain publishes. But it is more than ordinary crawling: check_exposed_files requests a fixed list of well-known paths such as .env, scan_domain also checks whether common admin panels are publicly reachable, and check_subdomain_takeover resolves common subdomain names and makes an HTTPS request to those pointing at cloud hosts. check_tls opens one ordinary TLS connection to port 443 from NEL's own infrastructure and reads the certificate the server presents, which is what any browser does. That activity is recognisable in a target's logs as a security check, so prefer running it against a domain you own or are authorised to assess.

Can it do port scanning or penetration testing?

No, and that is deliberate. Active techniques send traffic a target would reasonably call intrusive, so they are not exposed through an open MCP server. NEL VEIL offers active scanning at nelprofessional.com, after you prove you control the domain with a DNS TXT record.

What does it check for email spoofing?

It reads the domain's published SPF, DKIM and DMARC records and reports whether DMARC exists, whether its policy actually blocks spoofed mail rather than only monitoring it, whether SPF is present and not overly permissive, and whether the records are valid.

Want the full picture on a domain you own?

The web app adds active modules (port exposure, API probing and proof-of-concept checks) once you have verified ownership, plus a remediation report you can hand to an engineer.

Scan your own domain free →