netcheck-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@netcheck-mcpCheck example.com TLS, DNS, and security headers and tell me what to fix."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
netcheck-mcp
Ask your AI "is my site healthy and configured right?" and get a verdict with the exact fix.
netcheck-mcp is an MCP server with six focused checks for TLS,
DNS, HTTP, security headers, ports and email DNS. Every result starts with a VERDICT: PASS | WARN | FAIL,
and every problem comes with a concrete fix (the header line to add, the record to publish, the file to serve).
What is different from other site-audit MCP servers. The closest I found are all-in-one "audit this site"
servers such as security-mcp (one graded audit_site call that bundles
headers, certificate and email-auth DNS) and certificate management servers such as
CERT-MCP-SERVER. I only read their READMEs, not their code. netcheck-mcp is a
diagnosis toolkit instead: separate tools the agent can combine, and checks that tell why something is wrong:
TLS failures are told apart: expired vs not-yet-valid vs self-signed vs incomplete chain (server forgot the intermediate) vs untrusted root vs wrong hostname, each with its own fix. It parses the X.509 itself, so it can describe certificates that fail verification, which Python's
sslmodule refuses to decode.A hand-written DNS resolver (RFC 1035 over UDP with TCP fallback, name compression, TTLs, CNAME chains) with no
dnspython, that separates NXDOMAIN from NODATA and can ask any resolver (system, 1.1.1.1, 8.8.8.8, or a specific IP).SPF is actually expanded: includes and redirects are followed and the 10-lookup and 2-void-lookup limits are counted the way receivers count them.
SSRF protection by design (see Security), and tests that are hermetic: local CAs, local TLS/HTTP servers and a local DNS server, with the real-internet checks (example.com, badssl.com) in a separate opt-in suite.
One runtime dependency:
mcp.
What it looks like
Real output (tls_check incomplete-chain.badssl.com, abridged):
TLS check: incomplete-chain.badssl.com:443 (104.154.89.105)
VERDICT: FAIL
[FAIL] Server sends an incomplete chain: it ends at a certificate issued by 'C=US, O=Let's Encrypt, CN=YR1', which is not in the trust store (unable to get local issuer certificate).
fix: Serve the intermediate certificate(s) too: use the 'fullchain' file (leaf + intermediates), not just the leaf certificate.
[WARN] Server still offers TLSv1.0, which is deprecated (RFC 8996).
fix: Disable TLSv1.0: allow TLS 1.2 and 1.3 only (e.g. nginx: ssl_protocols TLSv1.2 TLSv1.3;).
[INFO] TLS 1.3 is not offered (TLS 1.2 works).
[PASS] Certificate is valid for another 52 day(s).
[PASS] Certificate covers incomplete-chain.badssl.com.
Handshake:
protocol TLSv1.2, cipher ECDHE-RSA-AES128-GCM-SHA256
supported: TLSv1.0=offered, TLSv1.1=offered, TLSv1.2=offered, TLSv1.3=not offered
Chain served (1 certificate(s)):
[0] CN=*.badssl.com (issuer: C=US, O=Let's Encrypt, CN=YR1; expires 2026-12-28)And from email_dns_check (against the test DNS server, an SPF record with too many includes):
[FAIL] SPF needs 14 DNS-lookup terms; the limit is 10 (RFC 7208), so receivers return permerror.
fix: Flatten includes, remove unused services, or replace include: with ip4:/ip6: ranges.Related MCP server: NEL VEIL MCP
Tools
Tool | What it answers |
| Certificate subject/SAN/issuer/validity/days left, chain served, hostname match, trust, TLS 1.0-1.3 offered, cipher. Expiry under 30 days WARN, under 14 FAIL. |
| A AAAA CNAME MX TXT NS CAA SOA SRV PTR with TTLs, the CNAME chain, NXDOMAIN vs NODATA (with negative-cache TTL). |
| Redirect chain with each hop's status and DNS/connect/TLS/TTFB/total ms, final URL, compression, caching headers, HSTS, downgrade and loop detection. |
| Grade A+ to F for HSTS, CSP (unsafe-inline/eval, wildcards), clickjacking, nosniff, Referrer-Policy, Permissions-Policy, cookie flags, version leaks, with the exact header to add. |
| TCP open/closed/filtered for up to 20 ports plus a passive banner grab; warns on exposed databases, RDP, telnet. |
| MX health, SPF syntax + lookup/void limits, DMARC policy, DKIM selector probe, MTA-STS / TLS-RPT presence. |
Try asking:
"Is the certificate on example.com okay? When does it expire, and is the chain complete?"
"Why does https://shop.example.com redirect so many times? Show me each hop and how long it took."
"Grade the security headers on my site and give me the nginx lines to fix them."
"My domain's mail is going to spam. Check SPF, DKIM and DMARC for example.org."
"Does www.example.com resolve the same on Cloudflare and Google DNS? What are the TTLs?"
"Is port 5432 on my server reachable from the internet?"
"Is
staging.example.comreturning NXDOMAIN or just no A record?"
Install
Requires Python 3.10+. Nothing else.
Claude Code
claude mcp add netcheck -- uvx netcheck-mcpClaude Desktop (claude_desktop_config.json)
{
"mcpServers": {
"netcheck": {
"command": "uvx",
"args": ["netcheck-mcp"]
}
}
}Or pip install netcheck-mcp and run netcheck-mcp.
To check hosts on your own network (a NAS, a staging box at 10.x, localhost), start it with the explicit opt-in flag:
"args": ["netcheck-mcp", "--allow-private"].
Security and responsible use
This server makes network connections on behalf of an AI agent, so it is deliberately cautious:
SSRF guard. By default every target is resolved and refused if any address is loopback, private (RFC 1918/ULA), link-local, CGNAT, multicast, reserved or a cloud metadata endpoint (
169.254.169.254and friends). This blocks the classic "make the server fetch its own internal services" attack, including numeric-IP spellings, IPv4-mapped IPv6 and hostnames that resolve to internal addresses.No DNS rebinding. The address that passed the check is the address that gets connected to; the name is not looked up a second time.
Every redirect hop is re-checked, so a public site cannot bounce you into the internal network. Redirects to non-http(s) schemes and URLs with embedded credentials are refused.
--allow-privatelifts the block for the whole process. Only the person who configures the server can set it; the agent cannot.Hard caps: 10 redirects, 1 MiB of body, 30 s total per HTTP check, 5 s connect timeout, at most 20 ports per call, one host per call. CIDR ranges are rejected. This is a health checker, not a scanner.
No secrets sent: no cookies, no
Authorization, no custom headers; the only request header beyondHostis anetcheck-mcp/<version>User-Agent.A custom DNS resolver you pass is held to the same private-address rule. The
systemresolver is whatever the machine already uses (it was configured by the machine's owner, not by the agent).
Only test hosts you own or are authorised to test. Port probing and repeated requests against third parties can be unwelcome or against their terms of service. You are responsible for what you point this at.
Limits you should know
OCSP stapling is not reported. Python's
sslmodule cannot see a stapled response.tls_checkreports the certificate's OCSP responder URL instead.Probing TLS 1.0/1.1 needs a client OpenSSL that still allows them. When it does not, the result says
untestablerather than guessing "not offered".Some DNS providers (Cloudflare among them) answer a nonexistent name with NOERROR/NODATA instead of NXDOMAIN ("compact denial of existence"). netcheck-mcp reports what the resolver said, so such names show as NODATA.
DKIM selectors are arbitrary, so the probe of common selectors can find keys but can never prove there is none. Pass your own via
selectors.DMARC is looked up at exactly
_dmarc.<domain>; the organisational-domain fallback for subdomains needs the Public Suffix List and is not done.The
systemDNS resolver on Windows is read from the registry (adapter settings), on Linux/macOS from/etc/resolv.conf.
Development
uv sync --extra test
uv run pytest # hermetic: local CA, TLS/HTTP servers and DNS server
uv run pytest -m network # optional: real example.com / badssl.com
uv run ruff check src tests && uv run mypy --strict srccryptography is a test-only dependency: the tests mint throwaway CAs and certificates (expired, self-signed, wrong
host, missing intermediate) at run time. The server itself parses certificates with its own DER reader.
There is a from-scratch tutorial that builds a small version of this server step by step: netcheck-mcp-the-hard-way.
License
MIT
Available Tools
6 toolsdns_lookupA
Look up DNS records with TTLs, following the CNAME chain.
types is a comma-separated list from A, AAAA, CNAME, MX, TXT, NS, CAA, SOA, SRV, PTR.
resolver is 'system' (this machine's configured DNS), 'cloudflare' (1.1.1.1), 'google'
(8.8.8.8), 'quad9', or an IP address (optionally ip:port) to ask a specific server, which
is how you compare what different resolvers see. The result says NXDOMAIN (the name does
not exist) separately from NODATA (the name exists but has no record of that type).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| types | No | A,AAAA | |
| resolver | No | system |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that TTLs are returned, that the CNAME chain is followed (extra queries/records beyond the literal name), and that NXDOMAIN and NODATA are reported as distinct outcomes. It omits any note on timeouts, retries, or whether lookups are cached, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the capability sentence, then one paragraph per non-obvious parameter, with zero filler or repetition. Every clause earns its place — the type list and resolver list exist precisely because the schema declares no enums.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still adds the key result discriminator (NXDOMAIN vs NODATA), which is genuinely useful. Minor gaps remain: no mention of name syntax edge cases (trailing dot, wildcards) or failure behavior if a custom resolver IP is unreachable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: `types` gets the full valid value list plus comma-separated syntax, and `resolver` gets every accepted value ('system', 'cloudflare', 'google', 'quad9', or a literal IP with optional port). Only the required `name` parameter is left uncharacterized, though its meaning is self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Look up DNS records with TTLs, following the CNAME chain.' The scope (TTL reporting, CNAME chain traversal) is concrete. It does not differentiate itself from the closest sibling, email_dns_check, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies one real use case — choosing a non-system resolver 'is how you compare what different resolvers see' — which implies when the parameter matters. However, there is no explicit when-to-use-this-vs-alternative guidance, and email_dns_check (the obvious overlap) is never mentioned or excluded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_dns_checkA
Audit a domain's email DNS: MX, SPF, DMARC, DKIM and MTA-STS.
MX targets must resolve and not be CNAMEs. SPF is parsed and expanded through include:/redirect=
and the 10-DNS-lookup limit and 2-void-lookup limit are counted (exceeding either makes receivers
return permerror). DMARC reports its policy (none/quarantine/reject), pct and rua. DKIM probes
common selectors; pass your own as a comma-separated selectors (e.g. 'mail2024,s1') since
selectors are arbitrary. MTA-STS and TLS-RPT presence are reported.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | ||
| resolver | No | system | |
| selectors | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does real work: it discloses that MX targets must resolve and must not be CNAMEs, that SPF include:/redirect= expansion is performed and lookup/void limits are counted with permerror consequences, and that DMARC policy, pct and rua are extracted. It stops short of stating that the tool is purely read-only or noting query volume/resolver rate considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the scope and followed by the per-record behavior that matters most. Every clause carries information about what will be checked or what will fail; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the description covers the diagnostic surface (MX, SPF limits, DMARC fields, DKIM selectors, MTA-STS/TLS-RPT) adequately for an agent to predict results. The only real hole is the undocumented `resolver` parameter and the absence of any note on query cost or timeout behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does well for `selectors`, explaining the comma-separated format, giving an example ('mail2024,s1'), and justifying why the caller must supply them because selectors are arbitrary. `domain` is self-evident, but `resolver` (defaulting to 'system') is never mentioned, leaving one of three parameters opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Audit a domain's email DNS,' then enumerates exactly which records (MX, SPF, DMARC, DKIM, MTA-STS). That enumeration cleanly separates it from the generic dns_lookup and from http_check/tls_check siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the record scope; there is no explicit statement of when to reach for this over dns_lookup or when a single-record lookup would suffice. The one concrete directive is about supplying DKIM selectors, which is operational guidance rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
http_checkA
Follow a URL through its redirects and time every hop.
For each hop: status, DNS/connect/TLS/time-to-first-byte/total milliseconds. Then judges the
final response: status, redirect problems (loops, >3 hops, HTTPS->HTTP downgrade, no HTTPS),
compression, caching headers, and HSTS. Sends no cookies or credentials; reads at most 1 MiB of
body; follows at most 10 redirects; gives up after 30 seconds. url may omit the scheme (https assumed).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses safety behavior (sends no cookies or credentials), resource limits (1 MiB body, 10 redirects, 30-second timeout), and the exact diagnostics produced. It stops short of saying whether the request is retried or how failures/timeouts are surfaced in the response, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then structured into per-hop output, final-response judgments, and safety limits. No sentence is filler, and the list of limits is compact enough to scan in one pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter, no nesting), an output schema exists so return structure needn't be described, and the description still covers purpose, limits, and the key parameter caveat. Nothing an agent needs in order 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single `url` parameter, and the description compensates with a genuinely useful semantic: 'url may omit the scheme (https assumed)'. That is exactly the ambiguity an agent would hit, though nothing is said about query strings, ports, or non-HTTP schemes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Follow a URL through its redirects and time every hop') and then names exactly what is measured per hop and on the final response. That scope is distinguishable from siblings like tls_check and dns_lookup, which cover narrower slices of the same request lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is for diagnosing redirect chains and end-to-end HTTP behavior, but the description never says when to prefer it over security_headers or tls_check, even though it overlaps both (HSTS, HTTPS downgrade). No explicit exclusions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
port_checkA
Check whether specific TCP ports on one host are reachable, and grab any banner.
ports is e.g. '22,80,443' or '8000-8005' (max 20 ports per call; this is a health check, not a
scanner, and CIDR ranges are refused). Each port is reported open, closed (refused) or filtered
(no answer, usually a firewall). Open ports are listened to passively for a banner (SSH, SMTP,
FTP announce themselves); nothing is sent. Warns when databases/RDP/telnet are open to the internet.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| ports | No | 80,443 | |
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, yet the description discloses a lot: banner collection is passive, nothing is sent, and filtered means no answer (usually a firewall). It also warns about databases/RDP/telnet exposed to the internet. Not covered are rate limiting or whether the tool needs any authorization, which leaves a small gap for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense, front-loaded prose: the core capability comes first, followed by the port syntax constraint, then the interpretation of states and the safety model. Every clause adds operational information; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-shape explanation is not required, and the description covers the semantics an agent needs for interpretation (open/closed/filtered, banners, risk warnings). The unexplained `timeout_s` is the only meaningful omission for a 3-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameters. It fully specifies the `ports` syntax and its 20-port ceiling, and implies `host` is a single host, but `timeout_s` is never mentioned, so one of three parameters is undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb-plus-resource formulation: checks TCP port reachability on one host and captures banners. It also implicitly separates itself from http_check/tls_check by framing the job as raw port state (open/closed/filtered) rather than protocol-level checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit scope limits: max 20 ports per call, health check rather than scanner, CIDR ranges refused. That tells the agent when this tool is inappropriate, but it never names a sibling (e.g. http_check or tls_check) as the alternative when a protocol-level probe is wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_headersA
Grade a site's security headers (A+ to F) and give the exact header line to add for each gap.
Covers Strict-Transport-Security, Content-Security-Policy (flags unsafe-inline, unsafe-eval, wildcards), clickjacking protection (X-Frame-Options / frame-ancestors), X-Content-Type-Options, Referrer-Policy, Permissions-Policy, cookie flags (Secure/HttpOnly/SameSite), version-disclosing headers, and cross-origin isolation headers. Follows redirects and grades the final page.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations the description carries the full burden and does real work: it discloses that redirects are followed and only the final page is graded, which materially affects results. It also enumerates the specific checks (unsafe-inline/unsafe-eval/wildcard flagging, cookie flags, version-disclosing headers, cross-origin isolation), though it omits how the site is fetched, timeouts, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence front-loads the action, the scale, and the payoff, which is exactly what an agent needs first. The second sentence is a long but load-bearing enumeration; each clause maps to a distinct check, though the run-on parenthetical could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain return values, and the single-parameter surface keeps the scope simple. The one real gap is URL input format and what happens on unreachable or non-HTML targets, which matters for a tool that performs live network fetches.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single url parameter, so the description would need to compensate by clarifying whether a bare domain or a scheme-qualified URL is expected. 'Follows redirects and grades the final page' adds meaningful behavior about how the URL is processed, partially filling the gap, but the accepted URL format is never stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Grade a site's security headers') plus the output scale (A+ to F) and what remediation content comes back ('the exact header line to add for each gap'). Enumerating the header families covered lets an agent distinguish this from siblings like http_check and tls_check without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is strongly implied by the coverage list (use this when you care about response headers, not transport certificates), but the description never states when to reach for this versus http_check or tls_check, and offers no exclusions or prerequisites. The agent must infer sibling routing from the tool name and subject matter alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tls_checkA
Check a host's TLS setup and judge it PASS/WARN/FAIL with fixes.
Reports the leaf certificate (subject, SAN, issuer, validity, days left, key and
signature algorithms), the chain actually served, whether the name matches, whether the
chain validates against the system trust store (distinguishing expired, self-signed,
incomplete chain and untrusted root), which of TLS 1.0/1.1/1.2/1.3 the server offers, and
the negotiated cipher. Expiry under 30 days is a WARN, under 14 days a FAIL.
host is a name or IP (no scheme); use port for non-443 TLS services (e.g. 465, 993).
OCSP stapling cannot be observed from Python's ssl module, so only the responder URL is reported.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| port | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so well: it enumerates exactly what is inspected (leaf cert fields, served chain, name match, trust-store validation), distinguishes failure modes (expired, self-signed, incomplete chain, untrusted root), discloses the grading policy (WARN under 30 days, FAIL under 14), and honestly reports a capability limit (OCSP stapling not observable, only the responder URL).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The verdict and purpose are front-loaded in the first clause, followed by the detail list and the parameter notes. The long multi-clause sentence itemizing certificate fields is dense and could be trimmed into a list, but every element it names corresponds to a distinct check the tool performs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter network inspection tool with an output schema and no annotations, this is complete: it explains what is tested, how results are graded, how to target non-standard TLS ports, and one known limitation. Nothing an agent needs in order to call it correctly or interpret a verdict is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters, and it does: `host` is 'a name or IP (no scheme)' and `port` is for non-443 TLS services with real examples (465, 993). The only gap is that the default of 443 is left to the schema rather than restated alongside the non-443 guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check a host's TLS setup') plus the output judgement ('judge it PASS/WARN/FAIL with fixes'), which differentiates it from siblings like port_check and security_headers that inspect connectivity or HTTP headers rather than the TLS handshake and chain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete invocation context: 'use port for non-443 TLS services (e.g. 465, 993)' and constrains `host` to a name or IP with no scheme. It never explicitly names which sibling to use instead for raw connectivity (port_check) or HTTP-level checks (http_check), so the routing is implied rather than stated.
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.
6 tool updates
v0.1.0- First observed
dns_lookup - First observed
email_dns_check - First observed
http_check - First observed
port_check - First observed
security_headers - First observed
tls_check
TDQS
Scored across 6 tools
Each tool targets a distinct diagnostic concern (HTTP hops, TLS handshake, DNS records, header grading, TCP ports, email DNS), and the descriptions make the boundaries explicit. The only real overlap is that http_check and security_headers both fetch a page and follow redirects, and http_check reports some TLS timing that tls_check also covers, so an agent may occasionally hesitate between them.
All names are snake_case, lowercase, and consistently resource-first (http_/tls_/dns_/port_/email_dns_ prefix). Minor deviations: the suffix alternates between _check and _lookup, and security_headers has no suffix at all, but the overall pattern is still predictable.
Six tools is well within the sweet spot and each one maps to a clearly separate diagnostic domain (HTTP, TLS, DNS, headers, ports, email). Nothing appears redundant or padded for the stated purpose of a network checkup server.
The surface covers the core network-health workflow end to end: reachability, TLS validity, DNS resolution, security headers, open ports, and email authentication. Gaps remain around domain registration/WHOIS expiry, IP/ASN reputation, and any raw HTTP request capability, but agents can still complete most audits with what is present.
Maintenance
Related MCP Connectors
Website health, SEO, security-header, SSL and broken-link audits for AI agents.
71HTTP, DNS, SSL, WHOIS, ping, security-header, SEO and AI-readiness checks for any website.
The website checker for AI agents. One call: verdict, score out of 100, fix list.
Monitors TLS/SSL certificate expiry, DNS resolution, and TCP port status for AI agents.
Related MCP Servers
- AlicenseAqualityCmaintenancePerforms comprehensive website health audits including SSL, DNS, email authentication, performance, uptime, and broken link checks, all without requiring API keys. Returns a scored report with weighted metrics and actionable recommendations.767 npmMIT
- AlicenseAqualityBmaintenanceEnables AI agents to perform passive security scans on domains, checking email spoofing (DMARC/SPF/DKIM), TLS weaknesses, security headers, exposed files, and subdomain-takeover risk without needing an API key.789 npmMIT
- AlicenseAqualityCmaintenanceEnables Claude to run safe, read-only diagnostics against servers and websites — certificate chains and expiry, HTTP status/redirects/security headers, DNS records, email authentication (SPF, DKIM, DMARC, MTA-STS, TLS-RPT) and sitemaps. Every check returns severity-tagged findings with concrete fixes, plus a 0-100 score and A-F grade, without any ability to modify the target.831 npmMIT

Enterno.io MCP serverofficial
AlicenseNot gradedqualityCmaintenanceThis server provides comprehensive website diagnostics, allowing AI agents and clients to perform detailed HTTP, DNS, SSL/TLS, security header, SEO, and AI-readiness checks on any public website. It covers a wide range of tools including WHOIS, email checks, and network analysis.MIT