method
How mcpcost measures
One open-source probe. The same steps for every server.
What we probe
The probe reads the official MCP registry. It uses the latest version of each server. It takes the first streamable-http remote. If the server has only an sse remote, it takes that one. Servers that ship only as a package on npm or PyPI are probed too: the package is installed in a container with the network on and no lifecycle scripts, then started with the network off and placeholder values for the environment variables the registry entry lists. “needs env”, “needs args” and “needs network” mean the server started but wants a real credential, an argument or a network. “crashed on start”, “install failed” and “no executable” are what they say. OCI and MCPB packages are not probed.
How we probe a server
- Connect with the official TypeScript SDK. The client name is
mcpcost. We send no credentials. - Send
initializeandnotifications/initialized. Record the time to theinitializeresult, the protocol version, the server name and version, the capabilities and the length of the instructions. - If the server has tools, call
tools/list. Follow the pagination. Record the time and the tools. - Do not open the standalone GET stream. The probe answers 405 to the SDK's GET. The probe needs no messages from the server. Some servers stop
tools/listwhile that stream is open. - Close the session.
Each request has a timeout of 15 seconds. We run one probe at a time against each host.
Results
- alive
initializeandtools/listwere successful.- needs auth
- HTTP 401 or 403. We record the
WWW-Authenticatescheme when the server sends one. The server is reachable, but it does not talk to clients without credentials. - paid (402)
- HTTP 402 Payment Required.
- newer protocol
- The server answers with a protocol version that the current SDK does not support. The server is reachable.
- not found
- HTTP 404, 405 or 410 on the MCP endpoint.
- not MCP
- HTTP 200, but the response is not a valid MCP reply. Or the server returned a JSON-RPC error to
initialize. - timeout, no DNS, TLS error, refused, server error, rate limited
- Transport failures. We name each one after its cause.
Token counts
Each server page shows up to three numbers for the tool definitions.
- Claude
- The exact count from the Anthropic
count_tokensendpoint, modelclaude-opus-5-5, tool names as the server publishes them. We send one request with the server's tools and a small marker tool, and one request with the marker tool only. The difference is what the server's tools cost. The tool-use system prompt is in both requests, so it falls out. The endpoint is free and calls no model. - Claude Code
- The same count with the prefix
mcp__<server>__on each tool name, as Claude Code sends it. The server part is the last segment of the registry name. In your own config it is the key you chose, so your number can differ by a few tokens. - o200k
- An estimate. We serialize each tool as compact JSON with
name,descriptionandinput_schemaand count with theo200k_basetokenizer. It is the same estimate for every server and it needs no API key. The exact Claude count is about 1.9 times this estimate at the median, because Claude renders the schemas in its own format and tokenizes prose in its own way.
“Of a 200k context window” divides the Claude count by 200 000. A request with tools also carries a tool-use system prompt one time: 286 tokens for Claude Opus 5.5. We do not add it to any server. Claude Code can defer MCP tools when they take more than 10 % of the context; the count then applies only to the tools it loads.
We count a server again only when its tool definitions change. The date next to the Claude count is the date of that count. About 5 % of alive servers publish a schema the endpoint refuses, for example a top-level oneOf. These servers show the estimate and the reason.
Same tool set
We hash the sorted tool names and their schema sizes. Servers with the same hash serve the same tools. This shows bulk publishers that register one server under many names.
Live check
/check probes one server on demand. It uses the same steps and a timeout of 10 seconds. The Worker does the network part and asks count_tokens for the exact Claude count. Your browser counts the o200k estimate, because the Worker has a small CPU budget. We keep a result for ten minutes. A URL that is already in the registry opens its page.
Machine access
Each server has JSON at /api/s/<name>.json. The list is at /api/servers.json. The live probe is at /api/check.json?url=…. The run summary is at /api/summary.json. The board is also an MCP server: https://mcpcost.ulehla.dev/mcp over Streamable HTTP, no auth. Its tools are lookup_server, search_servers, check_server and registry_summary. /llms.txt lists all of this.
Being a good guest
Each request carries the User-Agent mcpcost/<version> (+https://github.com/ondraulehla/mcpcost). The probe runs one time each day. It sends no tool calls. It makes at most three requests to each server. To exclude a server, open an issue with its registry name.
Run it yourself
git clone https://github.com/ondraulehla/mcpcost cd mcpcost && npm install npm run probe -- --sample 200 --per-host 2