Skip to main content
Glama
NELPROINC

NEL VEIL MCP

by NELPROINC

NEL VEIL MCP — free domain security checks for AI agents

Ask your agent "can someone spoof email from example.com?" and get a real answer in about ten seconds.

NEL VEIL MCP gives any MCP-compatible agent nine tools for checking a domain's public security posture: email spoofing (DMARC/SPF/DKIM), TLS weaknesses, 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.

Free. No API key. No signup.


Install

Claude Code — one command:

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

Any MCP client — add this to your config file:

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

Run it directly, to check it works:

npx -y nel-veil-mcp

It prints a ready line to stderr — something like nel-veil-mcp 0.2.1 ready — 9 tools, free passive tier. — and then waits for JSON-RPC on stdin. That is correct: it is a stdio server, not a CLI, and stdout carries the protocol, so nothing else is ever written there.

Requires Node 18 or newer.


Related MCP server: domain-security-mcp-server

30 seconds: is your domain spoofable?

After installing, ask your agent:

Check if example.com can be email-spoofed.

It calls check_email_spoofing. Real output for example.com at the time of writing:

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

Free check, built from public information. No port scanning and no exploit testing —
though some checks (well-known path requests, admin-panel reachability) do more than
passive reading; see nelprofessional.com/mcp. Active scanning requires verified domain
ownership and runs only at nelprofessional.com.
More: https://www.nelprofessional.com/mcp

That domain is in good shape. The finding people are most often surprised by is a DMARC policy of p=none — it looks configured, monitors everything, and blocks nothing.


Tools

Tool

Answers

check_email_spoofing

Can someone send email that appears to come from this domain? (DMARC/SPF/DKIM)

check_tls

Is this domain's certificate valid, trusted and not about to expire — and is the connection still negotiating a deprecated TLS version?

check_security_headers

Does this site send the headers that protect visitors in the browser?

check_exposed_files

Is this domain publicly serving files it should not be?

check_subdomain_takeover

Are there DNS records pointing at services someone else could claim?

scan_domain

All of the above at once, with a per-module score.

get_scan_report

Retrieve a scan already run at nelprofessional.com, by its scn_… id.

list_compliance_frameworks

Which laws and standards can this be checked against — and which can it not?

check_compliance

What do these findings suggest about alignment with GDPR, NIS2, PIPEDA, CCPA, ISO 27001, SOC 2 and 96 more?

Each returns a 0–100 score plus specific findings you can act on.

Compliance

check_compliance maps one passive scan onto a register of 102 frameworks across Canada, the United States, the EU/EEA, the United Kingdom, Asia-Pacific, Africa and the global standards — citing the specific provision each finding bears on.

Read the coverage field before repeating a score. Every framework reports how many of the scan categories it relies on were actually observed, as 9/16:

  • A framework whose relevant checks did not run has a null score and the tier "Not assessed", with a reason. That is unknown, not clean.

  • A clean result over fewer than half a framework's categories is "Partial", not "Strong".

  • 26 of the 102 are "Not assessable" — an anti-money-laundering regime, a consumer-protection statute, a criminal offences provision or a securities disclosure rule imposes no technical safeguard an external scan could ever evidence. They are listed and explained, never scored.

These are indicative readiness signals from public-surface evidence. They are not an audit, not a certification and not legal advice, and every framework also carries a note on what it requires that no external scan can see — consent records, impact assessments, retention schedules, vendor agreements, board governance.


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 here 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 several of these tools do more than read public records:

  • check_tls connects to the domain, but only as a browser would. It makes one 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 how many days remain, the subject alternative names, and the negotiated protocol and cipher. Nothing else is contacted, and no third party is asked to test the target. It reports an expired certificate, one expiring within 14 or 30 days, a self-signed certificate, an untrusted chain, a certificate that does not cover the hostname, and a connection negotiated over TLS 1.0 or 1.1. What one handshake cannot tell you: it shows what the server chose for that connection, not everything the server would accept. It does not enumerate supported cipher suites, does not test for Heartbleed, POODLE, DROWN or RC4 support, and produces no letter grade. Those need the deep assessment described below.

  • 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 and similar). It never brute-forces or fuzzes — the list does not grow or adapt — but these are paths a crawler would not request, so they are recognisable in a target's logs as a security check.

  • scan_domain runs all of the above, and additionally checks whether common admin panels (/phpmyadmin/, /manager/html) are publicly reachable.

Everything above is information the domain publishes. None of it attacks anything. But it is more than ordinary crawling, so prefer running it against a domain you own or are authorised to assess.

Active scanning — port exposure, API probing, proof-of-concept checks, and the deep TLS assessment (tls_labs) that produces the Qualys SSL Labs grade along with the Heartbleed, POODLE, DROWN and RC4 tests — lives at nelprofessional.com, behind DNS-TXT proof that you control the domain. None of it is reachable from this MCP server. That is the right place for it, because a human proves ownership once and NEL can stand behind the result.

Rate limits. Ten single checks and three full scans per minute, per IP address. If you hit it, wait a minute.

Privacy. This 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. Note that, like any HTTP service, NEL sees the IP the request came from — it is what the rate limit is keyed on.


Configuration

Variable

Default

Purpose

NEL_API_URL

https://api.nelprofessional.com

Point at a self-hosted NEL backend. Only needed for local development.


Development

These steps need the git repository, not the published npm package — the tarball ships only dist/, so src/ and scripts/ are not in it.

git clone https://github.com/NELPROINC/nel-veil-mcp.git
cd nel-veil-mcp
npm install
npm run build
node scripts/mcp-smoke.mjs example.com

scripts/mcp-smoke.mjs launches the built server exactly as npx would, performs the MCP handshake, lists the tools and calls one for real — so it catches transport and schema problems a unit test would not.


About NEL VEIL

NEL VEIL is the security scanner behind NEL Professional, a marketplace connecting organisations with verified cybersecurity professionals. The same modules that power this MCP server power the scans on the site.

Full documentation: nelprofessional.com/mcp


License

MIT — see LICENSE.

Available Tools

7 tools
check_email_spoofingCheck if a domain can be email-spoofedA
Read-onlyIdempotent

Answers: can someone send email that appears to come from this domain? Checks the published SPF, DKIM and DMARC DNS records — whether DMARC exists, whether its policy actually blocks spoofed mail (p=none only monitors, it does not stop anything), whether SPF is present and not overly permissive, and whether the records are syntactically valid. Returns a 0-100 score plus specific findings, each tied to the record it came from, so the exact problem can be quoted. This is a free check that uses public information: DNS records and ordinary HTTP requests. It does no port scanning and no exploit testing. Use this for any question about email spoofing, phishing impersonation, DMARC/SPF/DKIM setup, or whether an email domain is protected. For a broader picture covering TLS, headers and exposed files too, use scan_domain instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare domains work best; a full URL or a www. prefix is accepted and normalised. Do not pass an IP address, an email address, or a private/internal hostname — those are refused.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds valuable context beyond these: it explicitly states the check uses only public information (DNS and HTTP requests), performs no port scanning or exploit testing, and explains how findings are structured. This exceeds the annotation coverage with relevant operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is appropriately detailed but not bloated; it front-loads the core answer in the first sentence and then expands on scope, return format, and security posture. Each sentence contributes useful information, and the alternative usage note is placed at the end. Slightly longer than strictly necessary, but every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter and no output schema, the description carries the burden of explaining behavior and returns. It explicitly mentions the 0-100 score and findings tied to specific records, ensuring the agent knows what to expect. It also covers input restrictions and the broader scope of use, making it fully complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the 'domain' parameter with constraints and a basic description. The tool description enriches this by specifying that bare domains work best, that full URLs or www prefixes are normalized, and that IP addresses, email addresses, or private/internal hostnames are refused. This adds practical guidance not present in the schema, going beyond the high coverage baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear, specific purpose: it answers whether a domain can be email-spoofed by checking SPF, DKIM, and DMARC records. It explicitly differentiates from the sibling scan_domain by scoping its focus to email authentication records and mentioning the broader alternative. This makes the tool's role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: for any question about email spoofing, phishing impersonation, DMARC/SPF/DKIM setup, or domain protection. It also names the alternative (scan_domain) for a broader security picture, giving clear when-to-use vs. when-not-to-use direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_exposed_filesCheck a domain for publicly exposed sensitive filesA
Read-onlyIdempotent

Answers: is this domain publicly serving files it should not be? Requests a small, fixed list of well-known sensitive paths — things like .env, .git/config, backup archives and exposed configuration — and reports which return real content rather than a 404. Returns a 0-100 score plus a finding per exposed path. How it works, stated plainly: it makes ordinary GET requests for a small FIXED list of well-known paths. It does not brute-force, fuzz, or enumerate — the list never grows and never adapts to what it finds. Note that these are paths an ordinary crawler would not request (.env, .git/config), so the requests are recognisable in a target's logs as a security check rather than routine crawling. This is a free check that uses public information: DNS records and ordinary HTTP requests. It does no port scanning and no exploit testing. Use this for leaked secrets, exposed configuration, or accidentally published files. It does not discover subdomains.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare domains work best; a full URL or a www. prefix is accepted and normalised. Do not pass an IP address, an email address, or a private/internal hostname — those are refused.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, and the description does not contradict any of them. It adds substantial behavioral context beyond annotations: it explicitly states it 'makes ordinary GET requests for a small FIXED list of well-known paths', it does not brute-force/fuzz/enumerate, the list never grows or adapts, and it 'does no port scanning and no exploit testing'. It also discloses the operational fingerprint (requests are recognisable in logs), which is valuable for informed invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every sentence earns its place: it front-loads the core purpose, then adds essential operational clarifications (fixed list, no enumeration), safety assurances (no port scanning), and usage context. There is no redundancy or filler; the structure is logical and information-dense without being bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a security-check tool with no output schema, the description comprehensively covers what an agent needs: what paths are checked (.env, .git/config, backups), how the check works mechanically, what it does NOT do, the return format (0-100 score plus per-path findings), and the target domain constraints. Given the tool's complexity and the absence of an output schema, nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the domain parameter is fully documented in the schema, establishing a baseline of 3. The description reinforces that bare domains work best and that IPs/emails/private hostnames are refused, but this largely duplicates schema guidance. The description adds minimal new semantic value beyond the schema, so a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific question ('is this domain publicly serving files it should not be?') and a precise verb-resource pair (checks a fixed list of well-known sensitive paths). It clearly distinguishes itself from siblings by stating what it checks (exposed files like .env, .git/config, backups) and what it explicitly does NOT do ('does not discover subdomains'), setting it apart from check_subdomain_takeover and scan_domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use this tool ('Use this for leaked secrets, exposed configuration, or accidentally published files') and what it excludes ('does not discover subdomains'). It implies differentiation from sibling scan_domain by describing a narrow, fixed-path check rather than a full scan. It could explicitly name alternatives, but the context is clear enough for an agent to decide correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_security_headersCheck a domain's HTTP security headersA
Read-onlyIdempotent

Answers: does this site send the HTTP response headers that protect visitors in the browser? Checks for Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options / frame-ancestors, Referrer-Policy and Permissions-Policy — whether each is present and whether its value is actually protective rather than nominal. Returns a 0-100 score plus a finding per header explaining what a missing or weak value exposes. This is a free check that uses public information: DNS records and ordinary HTTP requests. It does no port scanning and no exploit testing. Use this for clickjacking, XSS mitigation, CSP or HSTS questions. It does not check the TLS certificate itself — use check_tls for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare domains work best; a full URL or a www. prefix is accepted and normalised. Do not pass an IP address, an email address, or a private/internal hostname — those are refused.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, open-world, idempotent, and non-destructive, and the description adds meaningful behavioral context: it uses only public DNS and ordinary HTTP requests, performs no port scanning or exploit testing, and returns a 0-100 score plus per-header findings. This goes beyond the annotations and is especially valuable since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but every sentence earns its place: it opens with the core question, lists checked headers, explains the output, describes the non-invasive method, states the intended use cases, and points to the sibling tool for what it does not cover. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one parameter fully documented in the schema, safety annotations already provided, and no output schema, the description still explains the return value (score plus per-header findings), the method of checking, and what it does not cover. The tool definition is complete enough for an agent to invoke and interpret it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description covers the single domain parameter 100%, including accepted formats and refused input types, so the description does not need to add much. The description adds no additional parameter detail beyond reinforcing that the domain is a website domain, which is appropriate given full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Checks for') and resource (domain HTTP security headers), names the exact headers examined, and explicitly contrasts itself with check_tls by noting it does not check TLS certificates. This makes the tool's purpose unmistakable and distinguishes it from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance ('Use this for clickjacking, XSS mitigation, CSP or HSTS questions') and an explicit when-not-to-use case ('It does not check the TLS certificate itself — use check_tls for that'). It also clarifies what the check does not involve (no port scanning, no exploit testing), so an agent can select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_subdomain_takeoverCheck a domain for subdomain-takeover riskA
Read-onlyIdempotent

Answers: does this domain have DNS records pointing at services someone else could claim? Inspects published DNS records for dangling CNAMEs — entries still pointing at a de-provisioned cloud or SaaS host (an unclaimed bucket, an expired app instance) that an attacker could register and then serve content from a hostname users already trust. Returns a 0-100 score plus a finding per at-risk record, naming the record and the service it points to. How it works, stated plainly: it resolves a small fixed list of common subdomain names (www, mail, dev, staging and similar) and, for any that resolve to a known cloud or SaaS host, makes one ordinary HTTPS GET to check for that provider's unclaimed-resource page. So it is not DNS-only — it does send a small number of HTTP requests to subdomains of the target. It never registers, claims, or modifies anything. This is a free check that uses public information: DNS records and ordinary HTTP requests. It does no port scanning and no exploit testing. Use this for dangling DNS, abandoned cloud resources, or subdomain hijacking risk.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare domains work best; a full URL or a www. prefix is accepted and normalised. Do not pass an IP address, an email address, or a private/internal hostname — those are refused.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations. It discloses that the tool sends a small number of ordinary HTTPS GET requests to subdomains, resolves a fixed list of common subdomain names, and never registers, claims, or modifies anything. These details are not captured by readOnlyHint=true or other annotations and give the agent a clear picture of the tool's network behavior and safety profile. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then explains the mechanism, clarifies non-actions, and ends with usage guidance. It is slightly long but every sentence carries relevant information—no fluff. The structure is logical and the critical safety points (HTTP requests, no modification) are given prominent placement. It earns a 4 rather than 5 because it could be tightened slightly without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must explain return values—it does: 'Returns a 0-100 score plus a finding per at-risk record, naming the record and the service it points to.' It also covers behavior, network impact, safety limits, and use cases. For a single-parameter tool with no nested objects, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'domain', is fully documented in the schema with type, length constraints, accepted formats (bare domains best, URL or www. normalised), and exclusions (IP, email, private/internal hostnames). The tool description does not add any parameter-specific details beyond what the schema already covers. Since schema coverage is 100%, the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise question, 'does this domain have DNS records pointing at services someone else could claim?', and immediately states it inspects DNS records for dangling CNAMEs. This clearly distinguishes it from siblings like check_tls or check_security_headers, which target other concerns. The verb 'check' and the resource 'domain for subdomain-takeover risk' are specific and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use: 'Use this for dangling DNS, abandoned cloud resources, or subdomain hijacking risk.' It also clarifies what it does not do ('no port scanning and no exploit testing'), which implies exclusions. However, it does not explicitly name alternative tools or spell out when NOT to use it, though the sibling list makes those obvious. That is a minor gap from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_tlsCheck a domain's HTTPS/TLS configurationA
Read-onlyIdempotent

Answers: does this domain's TLS configuration have known weaknesses? Returns the Qualys SSL Labs assessment grade for the host, plus findings for specific known problems when present: Heartbleed, POODLE, RC4 support, deprecated protocol versions, missing forward secrecy, and certificate chain issues. IMPORTANT — this one is NOT passive. It queries Qualys SSL Labs, which performs an ACTIVE assessment of the target from Qualys's own infrastructure (reusing a recent cached result when Qualys has one). NEL sends no probe itself, but running this does cause the target to be actively tested by a third party. Prefer it for a domain you own or are authorised to test. It is free, and it does no port scanning and no exploit testing of its own. It does NOT report certificate expiry dates, the issuer, or hostname validity — if you need those, read the certificate directly. It also does not check HTTP security headers — use check_security_headers for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare domains work best; a full URL or a www. prefix is accepted and normalised. Do not pass an IP address, an email address, or a private/internal hostname — those are refused.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations stating readOnlyHint=true and idempotentHint=true, the description transparently discloses that the tool is NOT passive and triggers an active assessment from Qualys's infrastructure, which is a behavioral nuance beyond what annotations convey. It also clarifies it does no port scanning or exploit testing itself, and mentions it reuses cached results when available. This fully discloses the external side effect and safety profile without contradicting annotations—'readOnly' is still true in the sense of not modifying the target.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, then lists specific findings, then warns about the active nature (critical for agent decision-making), and finally clarifies exclusions and sibling differentiation. Every sentence adds value, and the length is justified by the need to convey the active behavior and scope boundaries.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter and no output schema, the description is complete: it states what it returns (grade and specific findings), what it does NOT return (expiry, issuer, hostname validity), how it operates (external active assessment), and when to use it. It also covers edge cases (cached results) and exclusions. Nothing an agent needs to decide whether to call it and interpret results is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides a thorough description of the 'domain' parameter: accepted formats, normalization, and explicit exclusions. The tool description adds no additional parameter-level semantics beyond what the schema states. Since schema coverage is 100% and the parameter is simple, the baseline of 3 applies—no further clarification needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states precisely what the tool does: it answers whether a domain's TLS configuration has known weaknesses, returns the Qualys SSL Labs grade, and lists specific vulnerabilities it checks (Heartbleed, POODLE, RC4, etc.). It also distinguishes itself from siblings by explicitly saying it does NOT check HTTP security headers (use check_security_headers) and does NOT report certificate expiry/issuer/hostname validity, so an agent can differentiate it clearly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: prefer it for a domain you own or are authorized to test, and warns it is NOT passive because it causes a third-party active assessment. It also provides exclusions (do not pass IP, email, private hostname) and points to the alternative tool for headers, plus suggests reading the certificate directly for expiry/issuer needs. This is complete routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scan_reportRetrieve a previously run NEL VEIL scan by its idA
Read-onlyIdempotent

Answers: what did an earlier NEL VEIL scan find? Fetches the stored results of a scan already run at nelprofessional.com, by its scan id (the scn_... identifier shown on the scan page and in its shareable report link). Returns the saved findings and score for that scan. Use this to pull a scan someone already ran on the website into the conversation — to summarise it, compare it against a later scan, or turn it into a remediation plan. It cannot start a new scan: use scan_domain for that. It only reads scans that exist and are publicly retrievable by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
scan_idYesThe scan identifier, e.g. scn_1a2b3c..., from a nelprofessional.com scan page or report link.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint, idempotentHint, and destructiveHint=false, so the description's additional disclosure that it 'only reads scans that exist and are publicly retrievable by id' adds some context about access constraints. However, it doesn't elaborate on return format or error behavior beyond a brief mention of 'saved findings and score', which is not a significant behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately concise, starting with a direct question and answer, then explaining usage in clear sentences. It front-loads the core purpose and efficiently states exclusions without excessive verbosity, though it could be trimmed slightly by removing redundant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description provides a basic hint of what is returned ('saved findings and score') and outlines usage cases. It doesn't specify the exact structure of the result or handling of missing scans, but for a simple read-by-id tool with strong annotations, this is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema description already explains the scan_id format ('from a nelprofessional.com scan page or report link'). The description repeats this but adds no new meaning beyond the schema, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'Fetches the stored results of a scan already run' by scan id, and explicitly distinguishes itself from scan_domain ('It cannot start a new scan: use scan_domain for that'). The verb and resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use scenarios ('summarise it, compare it against a later scan, or turn it into a remediation plan') and names the alternative tool (scan_domain) for starting new scans. It also clarifies that it only reads publicly retrievable existing scans, leaving no ambiguity about scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_domainRun a full passive security posture scan of a domainA
Read-onlyIdempotent

Answers: what is this domain's overall security posture? Runs every passive NEL VEIL module in one pass — DNS, email authentication (SPF/DKIM/DMARC), TLS, HTTP security headers, cookies, CORS, exposed files, subdomain-takeover risk, technology fingerprinting, breach exposure, domain reputation, cloud misconfiguration and JavaScript supply chain — and returns findings from all of them with a per-module score. Use this when the question is broad: how secure is this domain, review this vendor, what should we fix first. For a single specific question prefer the narrower tool — check_email_spoofing, check_tls, check_security_headers, check_exposed_files or check_subdomain_takeover — which is faster and easier to read. It is free. What it actually sends, stated plainly, because "passive" means different things to different people. It performs NO port scanning and NO exploit testing. It DOES: request a fixed list of well-known paths, including common admin panels such as /phpmyadmin/ and /manager/html, to report whether they are publicly reachable; resolve a small fixed list of common subdomain names and make one HTTPS request to any that point at a known cloud host; and query Qualys SSL Labs, which performs its own ACTIVE TLS assessment of the target from Qualys's infrastructure. None of that is intrusive in the sense of attacking anything, and all of it is information the domain publishes — but it is more than a crawler does, and it is recognisable in the target's logs as a security scan. Prefer running it against a domain you own or are authorised to assess. Active scanning (port scans, API probing, proof-of-concept exploit checks) is deliberately not available through this MCP server; it requires proving control of the domain and runs only at nelprofessional.com.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe domain to check, e.g. example.com. Bare domains work best; a full URL or a www. prefix is accepted and normalised. Do not pass an IP address, an email address, or a private/internal hostname — those are refused.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already declare readOnlyHint and non-destructive, the description goes far beyond by detailing exactly what network actions occur (fetching well-known paths, resolving subdomains, querying Qualys SSL Labs which performs an active TLS assessment), and what does not happen (no port scanning, no exploit testing). This is critical context for a 'passive' scan tool and is unique added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place: it explains the scope, lists modules, provides usage guidance, clarifies 'passive', and sets expectations for authorization. It is front-loaded with the core purpose and then branches into detail. While not terse, it is well-structured and information-dense without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex scanning tool with no output schema, the description sufficiently covers what is returned (findings with per-module scores), safety implications, and operational boundaries. It notes the tool is free and explains why it is detectable in logs. An agent has all necessary context to decide when and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'domain' parameter is fully documented in the schema with restrictions (no IP, no email, no internal hostnames) and normalization behavior. The description adds no additional parameter-level detail, so given 100% schema coverage, the baseline of 3 is appropriate. It does not repeat or expand on the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs every passive NEL VEIL module in one pass, returning findings with per-module scores. It explicitly differentiates from sibling tools by name ('check_email_spoofing', 'check_tls', etc.) and describes the broad use case ('how secure is this domain').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool ('broad question') and when not to ('for a single specific question prefer the narrower tool'), names the alternatives, and even gives authorization guidance ('prefer running it against a domain you own'). This is comprehensive and leaves no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.3
    • First observedcheck_email_spoofing
    • First observedcheck_exposed_files
    • First observedcheck_security_headers
    • First observedcheck_subdomain_takeover
    • First observedcheck_tls
    • First observedget_scan_report
    • First observedscan_domain

TDQS

A4.5/5.0

Scored across 7 tools

Disambiguation5/5

Each check_* tool targets a distinct security aspect (email spoofing, TLS, headers, exposed files, subdomain takeover) with no overlap. scan_domain explicitly aggregates all passive checks and directs users to narrow tools for specific questions, while get_scan_report handles historical retrieval—all clearly differentiated.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: check_* for individual checks, scan_domain for the full scan, and get_scan_report for retrieval. The naming is uniform and predictable, making tool selection obvious.

Tool Count5/5

With 7 tools, the server is well-scoped for a domain security scanner: five focused checks, one aggregate scan, and one report fetcher. Each tool earns its place without redundancy or bloat, fitting neatly within the ideal 3-15 range.

Completeness5/5

The tool surface covers the core lifecycle of domain security scanning: specific checks for common vulnerabilities, a full scan combining all modules, and retrieval of past scans. No obvious dead ends or missing operations exist within the stated passive-scanning scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Security intelligence API for AI models. CVE lookup with EPSS/KEV, domain recon (DNS, WHOIS, SSL, subdomains, WAF), and code security checks (secrets, injection, headers). 16 tools, no API key required.
    55
    33
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Domain security reconnaissance for AI agents — 13 tools (DNS+DNSSEC, SSL/TLS, HTTP security headers, SPF/DKIM/DMARC email auth, port scan, ASN, RDAP/WHOIS) plus a one-shot security_scan returning a 0–100 Health Score (A–F). Free, no API key.
    15
    70 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to register domains, prove ownership, queue security scans (headers, TLS, DNS, ports, tech-fingerprint), and retrieve findings with severity and CVE details via the Eleion Scanner API.
    5
    19 npm
    MIT