How do you read an MCP endpoint check result?
An MCP endpoint check result comes down to one question answered in two steps — did the server's initialize call succeed without credentials, and if so, did tools/list then reveal which tools it exposes — because an MCP server that accepts both from anyone is callable by any AI agent or script that finds its URL, not just the one it was built for.
By AdminKit team, Netbase JSC · Updated October 29, 2026
What the check actually does, in order
AdminKit’s MCP endpoint check sends a real initialize request — the first call any MCP client makes — to the URL you enter, with no credentials attached. What happens next depends entirely on how the server responds:
- If
initializefails or returns an authentication error, the check reports that the endpoint requires auth and stops there — it never attempts to guess or brute-force credentials. - If
initializesucceeds with no credentials, the check continues totools/list, which asks the server to describe every tool it exposes: names and descriptions. - The check never sends
tools/call. It reads what a tool is named and what it claims to do, but never invokes one, so it cannot trigger a file write, a database query, or a shell command on the server it’s checking.
A result is therefore one of three shapes: authenticated (initialize rejected the unauthenticated attempt), open (initialize succeeded, and tools/list shows what’s exposed), or not an MCP server (the endpoint didn’t behave like one at all — wrong status code, connection refused, or a response that doesn’t match the expected handshake).
Reading an “open” result: why tool names matter
If your result shows the server accepted initialize with no credentials, the next thing to read is the tool list tools/list returned. The Model Context Protocol specification describes tools as the mechanism by which a server lets an agent take real action — reading files, querying data, calling an internal API — so a tool list visible to anyone, authenticated or not, is effectively a map of what an unauthenticated caller could ask the server to do if it also allowed tools/call. A name like read_file, run_query or execute_command is a stronger signal to act on urgently than something read-only and narrowly scoped like get_status. The check doesn’t grade severity for you — it hands back the names and descriptions, and reading them in context of what the server is meant to do is what turns “open” into an informed next step.
Reading the SSRF guard
A result that comes back refused, rather than open or authenticated, can mean the target resolved to a private, loopback, or otherwise internal address. AdminKit’s Check API refuses to probe such targets at all — this is a safety control on the check itself, not a finding about the server you’re testing. It exists specifically so the check can’t be repurposed to reach into a network it shouldn’t be able to see, the same reasoning behind server-side request forgery (SSRF) defenses generally: a service that fetches a URL on a caller’s behalf has to validate where that URL actually points, not just that it’s syntactically a URL.
What “authenticated” doesn’t confirm
A result showing initialize rejected without credentials is good news, but it only confirms that one call enforces authentication — not that the server’s broader authorization setup is sound. The MCP Authorization specification defines a full OAuth 2.1-based flow with requirements beyond a single rejected call: token audience validation (so a token issued for a different service can’t be replayed here), scope enforcement per tool, and correct metadata discovery. This check is a single external probe of the front door, not a substitute for reviewing that the rest of the authorization flow is implemented to spec.
What to do next, depending on the result
- Open, and not meant to be public — restrict network access or add authentication before anything else; this is the most urgent state, since any agent or script that finds the URL can currently read your tool list.
- Open, and intentionally public — confirm none of the exposed tools can take a consequential action without further confirmation, since an unauthenticated caller can see exactly what’s available.
- Authenticated — a good baseline; see how to secure an MCP server for the fuller checklist beyond authentication alone, including tool allowlists and treating tool responses as untrusted input.
- Not an MCP server / unreachable — confirm the URL and that the service is actually running before assuming anything about its security posture.
Exposure can change without anyone touching the server’s code — a redeploy, a network change, or a forgotten debug build can reopen a gap you already closed. Re-running this check periodically catches that; scan an MCP endpoint in CI covers running the same probe automatically on every push instead of relying on remembering to re-check by hand.
Next step: check your own endpoint
Run AdminKit’s MCP endpoint check against a server you own or are authorized to test. Only test a server you control — reachability probing against one you don’t can violate its own terms of use even though this specific check never calls a tool.
This guide is general information, not a security audit of your specific network — see our disclaimer for what AdminKit's guidance does and does not commit to.
Frequently asked questions
The result says 'no auth required' — does that mean my server is definitely broken?
It means the specific endpoint checked accepted an initialize call with no credentials, which is spec-compliant but risky if the server was meant to be internal-only. The Model Context Protocol specification makes authorization optional for HTTP-based transports, recommending rather than requiring it, so 'no auth required' is a statement of fact about this endpoint's current configuration, not a bug report — whether it's a problem depends on what the server is meant to expose and to whom.
What does it mean if tools/list succeeds after initialize?
It means the check could read your server's full tool list — names and descriptions — without ever proving who was asking. The check stops there and never calls tools/call, so it can't tell you what those tools would actually do if invoked, but tool names alone are often informative: a name like run_shell_command or query_database visible to an unauthenticated caller is a stronger signal of risk than one like get_weather.
Why does the result sometimes say the target was refused rather than giving a pass or fail?
AdminKit's Check API applies an SSRF guard to this check: if the hostname you enter resolves to a private, loopback or otherwise internal address, the request is refused outright rather than attempted, so the check can't be used to probe a target's own internal network through AdminKit's infrastructure. A refused result because of this guard is a check-safety decision, not a finding about the server itself — it means the request never went anywhere, not that the server failed a test.
What if the endpoint doesn't behave like an MCP server at all?
The check reports that plainly — a wrong status code, a connection refused, or a response that doesn't match the expected initialize handshake all come back as 'not an MCP server' rather than a false pass or fail. This matters because a server that's simply unreachable (wrong URL, service down, firewall blocking it) looks very different from one that's reachable and happily returns tool data with no auth — conflating the two would hide a real exposure behind what looks like a connectivity problem.
I expected authentication to be required and the result confirms it is — am I done?
This check confirms the one thing it tests: that initialize rejects an unauthenticated call. It doesn't verify your authorization flow is implemented correctly end-to-end (token audience validation, scope enforcement per tool, or resistance to a stolen token being replayed from a different service) — those require a deeper review of the server's own OAuth implementation, not a single external probe.
Want AdminKit to watch this for you?
Free checks tell you the state today. Protective DNS and monitoring tell you when it changes.
Talk to an expert
Huy Nguyen (David), Founder & CEO, Netbase JSC
Ask whether this fix applies to your setup, or get a second pair of eyes on your DNS and mail records.