<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Merlonix</title>
    <description>The latest articles on DEV Community by Merlonix (@merlonix).</description>
    <link>https://dev.to/merlonix</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4076691%2Fd4384f1d-0dc6-4338-a746-3e528d84f320.png</url>
      <title>DEV Community: Merlonix</title>
      <link>https://dev.to/merlonix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/merlonix"/>
    <language>en</language>
    <item>
      <title>We Health-Checked 86 Public MCP Servers. Not One Uses the Legacy Transport.</title>
      <dc:creator>Merlonix</dc:creator>
      <pubDate>Thu, 13 Aug 2026 18:28:24 +0000</pubDate>
      <link>https://dev.to/merlonix/we-health-checked-86-public-mcp-servers-not-one-uses-the-legacy-transport-74n</link>
      <guid>https://dev.to/merlonix/we-health-checked-86-public-mcp-servers-not-one-uses-the-legacy-transport-74n</guid>
      <description>&lt;p&gt;We keep a &lt;a href="https://merlonix.com/mcp-directory/" rel="noopener noreferrer"&gt;directory of public remote MCP servers&lt;/a&gt; and re-check every one of them through the same health checker that powers our &lt;a href="https://merlonix.com/tools/mcp-health/" rel="noopener noreferrer"&gt;free MCP health tool&lt;/a&gt;. It sends a real JSON-RPC &lt;code&gt;initialize&lt;/code&gt; handshake, follows up with &lt;code&gt;tools/list&lt;/code&gt; where it can, and records what came back.&lt;/p&gt;

&lt;p&gt;This post is the aggregate. Every number below comes from one snapshot run at &lt;strong&gt;2026-08-04T00:45:56Z&lt;/strong&gt; against &lt;strong&gt;86 reachable public remote MCP endpoints&lt;/strong&gt; — the servers in the directory that answered at the transport layer. Nothing here is modelled, sampled or estimated.&lt;/p&gt;

&lt;p&gt;One caveat worth stating before the numbers rather than after: 86 endpoints is a &lt;em&gt;curated&lt;/em&gt; set of well-known public servers, not a random sample of the ecosystem. It is biased toward servers that vendors publish and maintain. Read everything below as "what the visible, vendor-published part of the remote MCP ecosystem looks like", not "what all MCP servers look like".&lt;/p&gt;




&lt;h2&gt;
  
  
  The headline: legacy HTTP+SSE is gone
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transport&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Streamable HTTP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy HTTP+SSE&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not "mostly". Not "a long tail remains". Zero out of 86.&lt;/p&gt;

&lt;p&gt;This matters because the legacy two-endpoint HTTP+SSE transport — the one from the original 2024-11-05 spec revision, where you GET an SSE stream, wait for an &lt;code&gt;endpoint&lt;/code&gt; event, and POST your requests somewhere else — is still taught by a meaningful number of tutorials and blog posts that read as current. If you are building a server today and following one of those, you are implementing a transport that, in this sample, precisely nobody still serves.&lt;/p&gt;

&lt;p&gt;We wrote up &lt;a href="https://merlonix.com/blog/streamable-http-vs-sse-mcp-transports/" rel="noopener noreferrer"&gt;how the two transports differ on the wire&lt;/a&gt; separately. The short version for server authors: single endpoint, POST your JSON-RPC message, get the answer in the POST response.&lt;/p&gt;

&lt;h2&gt;
  
  
  We got this number wrong the first time
&lt;/h2&gt;

&lt;p&gt;The honest part of the methodology, because it changes how you should read the table above.&lt;/p&gt;

&lt;p&gt;Before we published this, our own classifier said &lt;strong&gt;11 of these servers were legacy SSE&lt;/strong&gt;. They were not. The bug was ours, and it is an easy one to make: our checker treated an SSE-framed &lt;em&gt;response&lt;/em&gt; as evidence of the legacy transport.&lt;/p&gt;

&lt;p&gt;That inference is wrong. Streamable HTTP explicitly permits a server to answer a POST with &lt;code&gt;Content-Type: text/event-stream&lt;/code&gt; — SSE framing is an allowed response encoding &lt;em&gt;within&lt;/em&gt; a normal request/response cycle. It has nothing to do with the legacy split-channel design. A server can be entirely modern and still hand you an event stream.&lt;/p&gt;

&lt;p&gt;The actual signal for the legacy transport is the server &lt;strong&gt;refusing the single-endpoint model&lt;/strong&gt;: a &lt;code&gt;405&lt;/code&gt; on &lt;code&gt;POST&lt;/code&gt; to the advertised URL, or a redirect to a separate SSE endpoint. Once we classified on that instead, all 11 reclassified to Streamable HTTP and the legacy count went to zero.&lt;/p&gt;

&lt;p&gt;If you are writing anything that detects MCP transports — a client, a registry, a monitor — check which signal you are keying on. "The response was &lt;code&gt;text/event-stream&lt;/code&gt;" will mislabel modern servers as legacy, and it will do it quietly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most public MCP servers are not open
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Handshake result&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Completed &lt;code&gt;initialize&lt;/code&gt; without credentials&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Returned 401/403 — reachable, healthy, credential required&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;86% of these public servers require authentication to do anything at all.&lt;/strong&gt; They are listed publicly, they are up, and they will not talk to you without a token.&lt;/p&gt;

&lt;p&gt;This is the single most common thing people get wrong when they wire up MCP monitoring, and it is worth being blunt about: &lt;strong&gt;a 401 is not an outage.&lt;/strong&gt; It means the server is healthy and you are missing a credential. If your monitoring collapses "401" and "down" into the same red state, you will page yourself for expired tokens and, worse, learn to ignore the alert that eventually means a real outage. They need to be separate states with separate responses.&lt;/p&gt;

&lt;p&gt;The corollary for directory operators: if you list remote MCP servers and claim to show live status, most of your entries are ones you cannot fully check. Say so. We mark auth-required servers distinctly rather than pretending a credentialed check happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everyone who negotiated a version negotiated the same one
&lt;/h2&gt;

&lt;p&gt;All 12 servers that completed the handshake reported &lt;code&gt;protocolVersion&lt;/code&gt; &lt;strong&gt;2025-06-18&lt;/strong&gt;. Twelve out of twelve.&lt;/p&gt;

&lt;p&gt;Notably, &lt;strong&gt;zero&lt;/strong&gt; answered on the newer stateless 2026-07-28 revision — the one that removes the &lt;code&gt;initialize&lt;/code&gt; handshake entirely (SEP-2575) and drops &lt;code&gt;Mcp-Session-Id&lt;/code&gt; (SEP-2567). Our checker specifically probes for it: if &lt;code&gt;initialize&lt;/code&gt; is refused but a direct &lt;code&gt;tools/list&lt;/code&gt; works, that is a stateless-generation server and we record it as healthy rather than broken. Nothing in this set has migrated yet.&lt;/p&gt;

&lt;p&gt;So the practical state of remote MCP right now is a monoculture: one transport, one negotiated revision. That is genuinely good news for anyone writing a client. It will not last, and the stateless revision is the thing to watch — a client that treats a refused &lt;code&gt;initialize&lt;/code&gt; as a fatal error will start reporting false outages the moment servers begin moving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handshake latency
&lt;/h2&gt;

&lt;p&gt;Round-trip time for the &lt;code&gt;initialize&lt;/code&gt; POST, across all 86:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fastest&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median&lt;/td&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90th percentile&lt;/td&gt;
&lt;td&gt;260&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slowest&lt;/td&gt;
&lt;td&gt;1,008&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A second to complete a handshake is not "down", and it will not trip any uptime check. It is also a full second added to the front of every agent interaction that touches that server, before a single tool has been called. If you operate a server, handshake latency is a user-facing number and worth alerting on separately from availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool surfaces are small
&lt;/h2&gt;

&lt;p&gt;Of the 12 servers we could enumerate without credentials, the total tool count was &lt;strong&gt;33&lt;/strong&gt; — a median of &lt;strong&gt;2.5 tools each&lt;/strong&gt;, ranging from 1 to 6.&lt;/p&gt;

&lt;p&gt;We would not generalise this to the whole ecosystem; the servers you can call anonymously skew toward narrow, read-only utilities, and the big authenticated platform servers behind the other 74 endpoints are where the 60-and-200-tool surfaces live. But it is a useful counterweight to the assumption that an MCP server means a large tool catalogue. Plenty of useful ones do one thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the directory covers
&lt;/h2&gt;

&lt;p&gt;The 86 servers span 17 categories, most heavily: Web &amp;amp; data (12), Dev &amp;amp; code (11), Observability (10), Productivity (9), Databases (7).&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce any of this
&lt;/h2&gt;

&lt;p&gt;Every number here came from an endpoint anyone can probe. Do it yourself in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sX&lt;/span&gt; POST https://your-mcp-server.example/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'accept: application/json, text/event-stream'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{
        "protocolVersion":"2025-06-18","capabilities":{},
        "clientInfo":{"name":"curl","version":"1"}}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;result&lt;/code&gt; containing &lt;code&gt;protocolVersion&lt;/code&gt; and &lt;code&gt;serverInfo&lt;/code&gt; means a live MCP server. A &lt;code&gt;405&lt;/code&gt; means legacy transport. A &lt;code&gt;401&lt;/code&gt; means healthy-but-credentialed. An HTML body means something is answering that is not an MCP server at all.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Full methodology and the continuously re-checked directory live at &lt;a href="https://merlonix.com/mcp-directory/" rel="noopener noreferrer"&gt;merlonix.com/mcp-directory&lt;/a&gt;. You can run the same handshake against your own server with the free &lt;a href="https://merlonix.com/tools/mcp-health/" rel="noopener noreferrer"&gt;MCP health check&lt;/a&gt;, or over MCP itself: &lt;code&gt;https://api.merlonix.com/mcp&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Snapshot: 2026-08-04T00:45:56Z, 86 reachable public remote MCP endpoints. These are point-in-time results, not real-time. If you run one of these servers and think we have measured it wrong, tell us — we would rather fix the checker than defend a number.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
  </channel>
</rss>
