The ledger tracks 79 public endpoints that answer tools/list without credentials.
Before that number does any work for anyone, here is what is behind it — measured, not estimated.
51 of the 79 endpoints — 65% — are the same hosted docs template. One generator, 51 vendors, 51 domains. The tool names are vendor-specific, so every contract fingerprint differs and a naive count sees 51 separate servers with 51 separate contracts. There is one thing behind them: if that generator ships a change, most of the registry moves on the same day, and the ledger would read like an ecosystem-wide event instead of one deploy.
No label of ours is involved in that count. It is the tool-name signature:
curl -s https://he110.github.io/mcp-drift-registry/api/registry.json | jq '
[ .servers[]
| select([.tools[].name] | any(startswith("query_docs_filesystem_")))
] | length'
# 51
The shared submit_feedback tool has a byte-identical schema fingerprint
(7faf8b71ae053b91) on 51 of the 51. All of them agree exactly.
One host in the registry serves more than one tracked endpoint — separate paths, one deployment behind them:
gitmcp.iogitmcp-docs, gitmcp-repo — 2 rows, one deploymentThe registry counts endpoints because an endpoint is what it can actually probe. If you are counting
MCP servers yourself, the two units are not the same, and nothing in a tools/list response
tells you which one you have.
Each identified platform collapses to one family. Each endpoint with no identified platform counts as its own — because we could not identify a shared generator is not evidence of independence, and rounding it the other way would flatter the number.
curl -s https://he110.github.io/mcp-drift-registry/api/registry.json \
| jq '.counts.platformFamilies, .counts.platforms, .counts.unlabelledPlatform'
# 21
# {"mintlify-docs":51,"openapi-explorer":5,
# "mintlify-search-only":4,"gitmcp":2}
# 17
Two of those labels almost certainly belong to one vendor in two different shapes. The counter does not merge them, because the two shapes share no tool at all — merging them on the strength of a common prefix in a string we wrote ourselves is a guess, and a guess does not belong in a counter. So 21 is an upper bound on independence, not a floor. The 17 unlabelled endpoints are unproven, not proven separate.
The practical consequence is the only reason this page exists: any per-server drift rate computed from this sample would be badly inflated, because 51 correlated observations would be counted as 51 independent ones. No rate gets published here without the family count beside it.
The search_* tool is nominally one template tool. Across the 51 endpoints it has
four distinct schema fingerprints.
querycb69ec950d34e626 |
38 | |
|---|---|---|
queryversionfb21dc8a09203eac |
7 | |
languagequery9718d03564ef138a |
4 | |
languagequeryversion7f49cff0033583af |
2 |
The split is not noise. Every stratum is a distinct combination of optional parameters that appear only where the tenant switched the matching feature on, with no remainder: the strata are the cross-product, not a cross-product plus anomalies. One generator, one nominal tool, and the contract still varies by tenant — with no user, no session and no credential involved anywhere in the sample.
What a single pulse cannot say is whether that is a rollout caught mid-flight or permanent divergence that will look identical next year. A single snapshot structurally cannot distinguish those two. That is the entire argument for keeping the series instead of recounting: in a few weeks the strata either converge or they do not, and then it is a fact rather than a shape.
If you integrate against one vendor's docs MCP and assume the next one behaves the same because the tool has the same name, you are already wrong today — and a census taken today will not tell you that.
Nothing, deliberately. It publishes the platform label and the family count, and then de-duplicates nothing, weights nothing and corrects no statistic. The sample is marked and you decide what it is worth. A correction applied inside the pipeline would be one more thing you would have to trust; a label is something you can check with the command above.
The gap in the sample is also the standing request: a server from outside that template is
worth several from inside it. The only requirement is that tools/list answers
without credentials.