Build1 distinct publisher2 min readUpdated
When a client shows no tools, the handshake usually worked and tools/list returned a valid answer. Four of the six causes in one field writeup sit in what the server declared.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Two piles, and most of the work is knowing which one you are standing in: either the server genuinely advertised zero tools, or it advertised them and the client discarded the entries [3]. Ordinary triage misfires here because the failures engineers are trained on come with a pointer attached. A refused connection or a 401 tells you where to look [13]. This one does not, and it is not the same bug as a server that never finishes initialize, nor a server sitting behind auth [12].
Count the causes the dev.to writeup enumerates and the asymmetry is hard to miss. Six named root causes, and four of them originate in something the server declared or failed to declare: the missing capability, conditional registration that registered nothing, malformed inputSchema entries, and tools loaded after initialize with no change notification [1]. The remaining two, pagination and protocol-version negotiation, are the ones where client behaviour can be the deciding factor [8][9].
Pagination is the case worth singling out, because it is the one that leaves evidence sitting in plain sight. tools/list supports cursor pagination, so a server can return an empty first page carrying a nextCursor, or a client can request one page and stop reading [8]. The raw response contains the cursor. Nobody looks at the raw response, because the palette already told them the answer.
That is the shape of the whole problem. The empty answer is a 200, and nothing in the transport or the protocol is broken [14]. Restarting the process is almost never the fix, and the fault is rarely on the client [11]. What is broken is the content of a correct message, and the content of a correct message is exactly what a green connection indicator is designed not to inspect.
The malformed-schema case is the most quietly expensive of the four. A strict client can filter a tool whose inputSchema is not a valid JSON Schema object rather than render it as broken, so advertising five tools with three bad schemas can surface two, or none [7]. No error is returned to the server author. A schema that validated yesterday and does not today removes a tool from every agent that depends on it, and the only symptom is absence.
An MCP server can therefore be running, reachable, protocol-correct and honest, and still inform every client it has nothing to offer [1]. The client is not confused. It asked, or it was told not to ask, and it reported the answer it got [2][4].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The single most common cause is that the server never declared the tools capability in the initialize result; a spec-compliant client that does not see capabilities.tools may never call tools/list at all.
The giveaway for a missing tools capability is that the initialize response parses fine but its capabilities object is missing tools entirely.
The fix is almost never 'restart it', and it is rarely on the client; it is usually one specific thing the server did or did not say.
In the no-tools state the transport connected, the initialize handshake completed and parsed, and the client asked the server what it can do; the answer was 'nothing' or close to it. The handshake is healthy; the tool inventory is empty or unreadable.
When a client shows no tools it has almost always received a perfectly valid tools/list response, one whose tools array is empty or whose entries the client discarded.
Every no-tools case falls into one of two halves: the server genuinely advertised zero tools, or the server advertised tools and the client dropped them; telling which pile you are in is most of the work.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
One practitioner writeup, mechanisms plausible, nothing corroborated
All content derives from a single dev.to post with no second publisher, no named client or server implementation, no version numbers, no logs, and no reproduction. The described mechanisms are specific and internally consistent with how MCP initialize capabilities, tools/list cursor pagination, inputSchema validity and tools/list_changed notifications work, which lifts the score above bare assertion, but frequency ordering is unmeasured and one enumeration count is internally inconsistent.
No adoption signal in the cluster
The single source is a debugging explainer. It reports no releases, deployments, usage disclosures, benchmarks, pricing or licence changes, and no data on how many MCP servers or clients exhibit these failure modes, so there is nothing to measure.
Modest claims, mildly over-precise on cause ranking
The piece makes no grand assertions and sells no product; its framing that an empty list is a successful response is well matched to the mechanics it describes. The small positive gap comes from stated confidence exceeding evidence in two places: an unmeasured 'single most common cause' ordering, and a 'rarely on the client' verdict that sits against three client-side causes in its own list.
Developer-blog expertise signalling, no product pitch observed
The observable incentive is reputational: a practitioner publishing troubleshooting authority on a developer platform. The text names no vendor, sells no tool or service, and includes no affiliate or product call to action, so commercial distortion pressure is low; the residual reflects the general pull toward confident, tidy taxonomies that make a writeup more shareable than a hedged one.
Coherent mechanics, single unverified source, no adoption data
Confidence is limited by one publisher, one article, no corroboration and no adoption measurement, and by a counting inconsistency in the aggregate framing. It is held above the floor because the individual mechanisms are concrete, mutually consistent, and independently checkable by any reader against a live initialize and tools/list exchange.
build
The MCP transport your search results teach has been deprecated since March1 distinct publisher
build
SSE in Go breaks twice before your handler runs: an illegal header, then a 30-second timeout1 distinct publisher
build
Rate limit your MCP servers, because a retrying agent turns one error into a billing incident1 distinct publisher
build
Thirty minutes a day, and none of it from letting the agent write Swift1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 24, 2026