Build1 publisher3 min readPublished
An MCP server answers one unauthenticated initialize POST with its name and version
The only public count of internet-exposed MCP servers is fourteen months old, so a new open-source scanner fingerprints them by protocol handshake and reports which ones answer a caller holding no credentials.
The Engineer · Build desk

What happened
- A scanner published as themsquared/shadow-mcp-scanner finds MCP servers on a network and reports what each gives an unauthenticated caller, running in about fifteen seconds with Docker as its only dependency.
- Alfredo Oliveira and David Fiser at Trend Micro counted 492 internet-exposed MCP servers in July 2025 running with no client authentication and no transport encryption, exposing 1,402 tools between them.
- That July 2025 report is still the figure people reach for, and no follow-up census has been published since.
- Handed five addresses with no labels saying which were MCP servers, the scanner worked out that four spoke the protocol and reported the posture of each.
- The open demo server answered an anonymous tools/list with a warehouse SQL tool, a mailer that sends as noreply@, and a CRM lookup returning billing contact and plan.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint The only public number counts internet-facing servers, so a platform team asking how many MCP endpoints its own VPC exposes to every workload and VPN laptop gets nothing from 492.
- capability One request per address is cheap enough to run as an internal sweep. A team can enumerate endpoints it has no catalog entry for and no credentials to.
- exposure Tool descriptions on an open server give an anonymous caller an internal hostname, a port and a service account name before any tool is invoked.
- decision Anyone writing such a sweep has to decide whether to probe the legacy SSE transport, and in the demo the server that spoke only SSE was one of the two open ones.
A JSON-RPC `initialize` sent as an HTTP POST is the entire discovery primitive. A real MCP server answers with a protocol version and a `serverInfo` block giving the implementation name and version, and the demo capture shows protocol version 2025-06-18 from a server calling itself mcp-open 1.4.2 [12]. That costs one request, needs no credentials, and works whatever the service calls itself [13]. Port scanning cannot substitute, because the port an MCP server picked tells you nothing about it [11].
There is a second transport to probe. Before Streamable HTTP, MCP ran over HTTP+SSE: a `GET /sse` that opens an event stream and announces where to POST, and plenty of deployed servers still run it [14]. A GET answered with `text/event-stream` and an `event: endpoint` line is an MCP server too [15]. The scanner tries the current transport first and falls back to SSE [16], which puts the upper bound at two requests per address [28].
The five-address network ships with the scanner [3], so the output is a demonstration of the probe. Two of the four MCP servers in it answered with no auth [17], in a five-host demo network. One of those five hosts is an ordinary web dashboard, put there so the output shows the scanner keying on the protocol [19]. The runtime is the part that transfers: about fifteen seconds for five endpoints, with Docker as the only dependency [3].
1,402 tools across 492 servers averages about 2.9 tools per server [26]. More than 90% of those servers offered direct read access to a data source [6], which puts at least 443 of them one anonymous call away from someone's database [24]. About 74% sat on AWS, Azure, GCP or Oracle [7], roughly 364 hosts [25].
For 492 to still describe the internet, counting would have had to keep pace with deploying. r/mcp posts about a dozen new servers on an ordinary day [9]. Between the July 2025 count and this post's publication on 16 September 2026 [4] runs about fourteen months, and at a dozen a day that is on the order of 5,000 announcements from one subreddit in the interval [27]. That number holds only if an ordinary day is typical and each post is a separate server, and both of those remain assumptions.
The case for scanning inside rests on scope. A server bound to a VPC, reachable by every workload in the cluster and every laptop on the VPN, fell outside the 492 from the start [10]. Nobody has counted that population, and the demo network here is five addresses.
`initialize` establishes that a server exists. `tools/list` says what it can do, and an open server answers that for an anonymous caller as readily as for an authorised one [21]. In the demo output the summary line for the warehouse tool is truncated mid-word, and the full description reads: "Execute a read-only SQL statement against the analytics warehouse (warehouse-prod.internal:5439, service account svc_analytics)." [23]
What to watch
- A second census of internet-exposed MCP servers. The July 2025 count of 492 is still the only public number.
- Whether deployed servers drop the legacy HTTP+SSE transport. A sweep needs the GET /sse probe only while they run it.
- Whether servers the scanner reports as PROTECTED (no discovery) turn out to leak tool descriptions by another route.