Methodology
WorkingMCP is a snapshot, not a vibe. A remote server is alive when it speaks MCP. A server that asks you to log in is marked that way. A stdio server is never started.
Where the list comes from
The official registry is paginated from https://registry.modelcontextprotocol.io/v0/servers with version=latest until nextCursor runs out. Deleted records are skipped.
GitHub is a second source: topic:mcp-server, sorted by stars. The search API returns at most 1,000 repositories, so the snapshot keeps those 1,000. When a repository URL matches a registry server, the stars, license, archive flag, and last push are copied onto that record. Topic-only repositories are listed as stdio. The topic is self-applied, so it includes projects that are not only MCP servers.
Remote health check
Each public HTTPS endpoint gets one budget of 10 seconds. The client sends initialize, then notifications/initialized, then tools/list. If the tool list has a cursor, further tools/list pages are read inside the same budget. The user agent says what this is.
- Allowed methods: initialize, notifications/initialized, tools/list.
- tools/call is never sent. No tool arguments are invented.
- Query strings and URL userinfo are stripped before the request and before anything is published.
- Localhost, private IPs, link-local addresses, and non-public hosts are not requested. DNS answers that point at private addresses are refused.
- Streamable HTTP is tried for streamable-http. SSE is tried for sse. A 404, 405, or 406 falls over to the other transport once, still inside the 10 seconds.
HTTP 401, 403, 402, and 407, a WWW-Authenticate header, a login redirect, or a JSON-RPC error that asks for credentials becomes needs login. A URL template with missing variables, or a required secret header with no default, is needs login without a request. Timeouts, DNS failure, HTTP 5xx, and responses that are not MCP are dead.
If initialize succeeds and tools/list fails for a reason other than auth, the server stays alive with an empty tool list. It spoke MCP. It did not hand over tools.
Stdio servers
Packages whose transport is stdio are not installed and not spawned. There is no npx, uvx, docker, or subprocess. The score uses public signals only: last push (GitHub pushed_at, which is the closest date the search API gives), archived or not, whether the named npm or PyPI package returns HTTP 200, star count, license, and whether a description exists.
Token cost
After tools/list, the parsed tool objects — names, descriptions, and input schemas — are serialized with JSON.stringify as { tools }. That string is counted with js-tiktoken using the o200k_base encoding. The count is what a client pays to load the tool list. Calling a tool would cost more, and we do not do that.
Tool descriptions are sanitized and HTML-escaped before they are written into the snapshot. Pages render them as text, never as HTML.
Score
The bands are separate on purpose. A checked alive server stays above an auth wall. An auth wall stays above an unexecuted package. A dead endpoint stays last. Token weight can lower an alive server inside its band. It cannot demote it into “dead”.
Alive, floor 64
- Answered: +74
- 1–30 tools: +6. 31–80 tools: +3. More than 80: -2
- Token penalty: minus one point per 800 tokens, capped at 12
- Handshake under 800 ms: +3. Under 2000 ms: +1
- License: +2. Stars: log10, up to +8
- Archived: -8. Pushed within 90 days: +3
Needs login, 40–60
- Asked for credentials: +46
- License +2. Stars up to +6. Recent push +3. Archived -6
Stdio, cap 39
- Base +20, because it was not executed
- npm or PyPI package exists: +8
- Pushed within 120 days: +6. Within 365 days: +3
- License +3. Stars up to +6. Description +2. Archived -10
Dead, cap 9
- No handshake: +3. Stars up to +4. Open repository +1
Movers
A single snapshot has no yesterday. For registry servers with a known star count, popularity rank is the star order and health rank is the score order. The gap is popularity rank minus health rank. A gap of 8 or more, and not dead, is rising: healthier than it is famous. A gap of −8 or less is falling. GitHub-topic-only rows are left out of movers so a famous repo that merely wears the topic does not define the list.
Report pages
A Cloudflare Pages Free project stops at 20,000 files. The build keeps at most MAX_PAGES report pages, 17,000 unless you set that variable. Slots are handed out by rank inside each status, with a floor so alive, needs login, dead, and stdio all keep pages. The counts on the home page are the full snapshot in stats.json. A server without a report page is left out of the directory and the search index.
What this is not
- Not a security audit. A live handshake does not mean the server is safe to give a token.
- Not a guarantee that a stdio package still installs.
- Not a full history. The Cloudflare cron stores later checks in D1; this site is the static snapshot from npm run build.