日本語
verify/survey
survey · report 0 published 2026-08-19 · report 1 published 2026-08-23

We are going to measure servers that nobody asked us to measure.

The check is read only. It reads an endpoint, reads a card, and hashes what it saw. You can point it at a server you do not own, and so can we. Until now we have only ever pointed it at servers that volunteered. That was the mistake.

read only no account weekly at most every result recomputable
Report 0 is out. 22,636 registered, and 12,077 of them declare an address you can reach.

Measured 2026-08-19, one full walk of the official registry, 229 pages, stopping because the cursor ran out rather than because I ran out of patience. Raw JSON, the full endpoint list and the record hash are on the report.

Not one of those endpoints was contacted. This is a count of declarations. Whether they answer is a separate measurement and it is not in report 0.

Read report 0

What this box said before the count was run

It is left here on purpose. The claim this whole page rests on is that the method was published before the result existed. That claim is only checkable if the earlier text is still visible, so it is not edited and it is not deleted.

There is no number on this page yet. A survey that publishes its method after its results can choose the method that produced the results. So the method is here first, in public, with nothing measured. If the numbers turn out to be boring, they get published boring. If they make us look bad, they get published anyway. Our own servers are in the same population and are measured by the same machine on the same day.

written 2026-08-19 before any measurement · superseded the same day by report 0 · kept
Where the population comes from

We had a bigger number. We stopped using it after reading a text file.

The plan was to take the list from a public catalogue that indexes tens of thousands of open source MCP servers, and measure whatever had an address. Then we read its robots.txt.

glama.ai/robots.txt  ·  read 2026-08-19
User-agent: *
  Disallow: /api/
  Disallow: /*/endpoints
  Content-Signal: ai-train=no, search=yes, ai-input=yes

So we did not. One of the five rules we set for ourselves below is that we respect robots.txt. Breaking it on day one, to collect the list for a survey about disclosure, would have settled the question of whether this survey is worth reading.

The population comes from the official registry instead, which publishes a JSON API for exactly this and requires no account.

source
registry.modelcontextprotocol.io/v0/servers
selection
Entries that declare a remote endpoint in remotes[]. The operator states the address themselves. We do not guess which servers are reachable, and we do not scan for them.
excluded
Everything that runs locally over stdio, which is most of them. They cannot be measured from outside, so they are not measured, and they are not counted as failures.
cadence
Weekly at most. A survey that hammers the servers it is judging has already lost the argument.
The five rules we bound ourselves to

Naming a server that failed is a serious thing to do

These are not aspirations. If one of them is broken, the report that broke it gets withdrawn and the withdrawal stays published.

  1. Never write "it went down"

    held means we could not measure it. pending means we measured it and a condition was not met. These are different sentences and they never get collapsed into one. An instrument failure is not a statement about the thing it failed to measure.

  2. State the measurement, not a character judgement

    Not "this server is dishonest". "On 2026-08-19 the agent card carried no compensation disclosure." The first is an opinion we are not qualified to hold. The second is a fact anyone can check.

  3. Ship the recipe and the hash with every claim

    Every verdict carries a record_sha256 and a public procedure to recompute it. A claim about somebody else that cannot be reproduced by the person it is about should not be published.

  4. Keep a door open for corrections

    If you think a measurement of your server is wrong, ask and it is measured again. Both measurements stay published. The old one is not deleted, because deleting it would make the new one unverifiable. The desk exists before the naming does: corrections, free, no account, and you do not have to own the server.

  5. Respect robots.txt and keep the load low

    Read only, weekly at most, and never a tool call. The moment this survey becomes a nuisance to the servers it measures, it stops being a survey.

Report 1, and the walk that was thrown away

The first full walk broke the first rule. It was caught before publication, not after.

On 2026-08-23 the walk ran against all 12,429 endpoints and finished with a number. The number was 11,794 held. It is not published, because it was not a measurement of anybody’s server.

Eighteen minutes in, our own name resolution stopped working. The walker did not notice.

From 06:35Z onward, 11,307 consecutive endpoints were recorded as not reached, and not one of them succeeded over the following hour and forty minutes. Before that moment the same walk had reached 1,001 endpoints out of 1,122. Nothing about the population changed at 06:35. Our machine did.

The row that settles it belongs to a host called api.m2mcent.com. It answered 113 HTTP requests during the healthy period. Every one of its remaining 163 endpoints was then recorded as not reached. A host that answers 113 requests does not disappear.

The first of the five rules above says held means we could not measure it, and that an instrument failure is not a statement about the thing it failed to measure. This walk broke that rule against 11,307 servers, and it broke it silently.

survey1_walk · run 1 · 2026-08-23 · discarded
  rows written                      12429
  reached, before 06:35Z             1001
  reached, after  06:35Z                0
  longest run of not reached        11307

  not reached, total                11428
    "not reached: URLError"         11422
    "not reached: timeout"              5
    "not reached: InvalidURL"           1

The defect underneath the defect is the last three lines. The walker recorded only the name of the exception class, so 11,422 rows carried an identical reason string. From the file alone, a server that no longer exists and a resolver that had stopped answering were the same row. We could not have told the difference after the fact, and neither could you.

reason
Now carries the errno and the underlying cause, not just the exception name.
control
After 25 consecutive unreachable results the walker stops accusing the population and probes a known good address instead. Two of them, one ours and one not ours. If the control answers, the streak is a property of the population and the walk continues.
discard
Results taken while the control was also unreachable are thrown away and measured again after recovery, rather than written down.
abort
If the control does not come back within 900 seconds the run stops. A missing row is better than an invented one.
retry
One retry, after a pause, before any unreachable result is written at all. A resolver stumbling for a second should not become a permanent claim about somebody’s server.
aggregate
The aggregator now refuses to count a file with this shape and exits with an error. Pointed at run 1, it refuses, on two independent checks.

Run 1 is not partially salvaged. Its first 1,122 rows were taken while the instrument was healthy and would probably survive scrutiny. But choosing where to cut is a judgement, and a survey that decides which of its own rows to keep has stopped being a survey. The whole run is discarded and all 12,429 endpoints are being measured again.

Both files stay published. The discarded rows are the evidence that the rule was broken, and deleting them would make this paragraph unverifiable.

Stated plainly

Nothing external caught this. No operator complained, because nothing had been published yet. It was caught because the counters in the log had frozen in a shape that did not match the pilot runs, and that was worth an hour of checking before it was worth a page. If this survey is ever going to name somebody else’s server, this is the standard it has to hold itself to first.

written 2026-08-23, while run 2 was still walking · report 1 did not exist yet · it does now
What the first report will contain

Three counts, and a list

count 1
How many entries are on the registry.
count 2
How many of those declare an address you can reach from outside.
count 3
How many of those actually answered. This is not in report 0. It means sending 12,429 requests to other people's servers, and that is not something to rush because a page said it would happen.
Answered 2026-08-23 in report 1: 5,785 of 12,429 spoke MCP. The first attempt was discarded in full. The sentence above is left exactly as it was written, before the number was known.
then
For each of the five conditions, how many met it and how many did not, with the list. Our own rows are in the same table.
and
The exact procedure, so you can run it yourself and get the same three counts.

The interesting part is probably count 2. Most people talking about the size of this ecosystem are quoting a number that includes tens of thousands of servers that cannot be reached from anywhere. We do not know the gap yet. Nobody has published it.

Stated plainly

This page exists because the opt-in version of this project did not work. We built a machine, asked people to volunteer their servers, and nobody outside our own customers did. The machine was never the problem. Waiting to be asked was.