Build1 distinct publisher3 min readUpdated
A dev.to writeup makes the structural case: tool and schema drift exists only as a diff between two snapshots, so no single health probe can find it, however thorough.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A remote MCP server can ship a change that breaks every agent calling it while every signal a conventional uptime check reads stays green: the endpoint still answers 200, the initialize handshake still completes, tools/list still returns a result [1]. According to a dev.to writeup on detecting drift, what moved is not the transport but the advertised capability contract, and that class of change produces no transport-level symptom at all [2].
The mechanism is unremarkable, which is why it keeps happening. A tool's inputSchema is a JSON object in a deploy, MCP servers are young and mostly maintained by small teams, and there is no compiler standing between someone renaming a required field, tightening an enum, or deleting a tool nobody remembered was still being called, and the moment every connected agent starts calling it wrong [3][12].
The reason this lands on consumers rather than the server is how agents work. They call tools/list once, often cached for the session and sometimes across sessions, read each tool's name, description and inputSchema, and use exactly that to decide which tool to call and how to shape the arguments [11]. That contract is the whole interface. Change it underneath a cached client and the agent is not talking to a broken server, it is talking to a healthy server that agreed to different terms.
The writeup enumerates six shapes this takes [15]. A tool disappears, and any agent that calls it gets a JSON-RPC error mid-flight rather than at startup, surfacing wherever the agent happened to reach for it [4]. A tool appears, which is informational on its own but is also how you notice a server forking its capability set per client or per deploy [5]. A tool keeps its name and changes its inputSchema: a renamed field, a narrowed type, a new required parameter, or a reworded description that changes how a model decides to call it [6]. That third case is the dangerous one precisely because the tool remains callable, so nothing errors immediately and calls simply begin failing validation or getting silently misinterpreted [6]. The server stops advertising resources or prompts, or starts, and anything built against the old capability list breaks the moment it reaches for what is gone [7]. The protocol or server version changes, which is not breaking by itself but marks that something was deployed and is worth correlating against the rest [8]. And the server crosses the stateful/stateless boundary, answering the classic initialize handshake one day and only stateless tools/list the next, which is a change to the entire transport contract [9].
None of these are visible from a single observation. They exist only as a diff between two snapshots, which is why a one-shot probe cannot catch them no matter how much of the response it inspects [10]. Compare a REST API, where a removed field or a changed type usually breaks a build against a generated client or shows up as a 4xx that monitoring already watches for; MCP tool schemas have no equivalent gate today [12].
What to watch is whether your checks keep state. Detection needs a fingerprint of the contract at a point in time and somewhere to keep the previous one [13]. Names alone are not enough: two tools/list calls returning the same five names say nothing about whether the third tool's schema moved, so the useful unit is a per-tool digest over name, description and inputSchema, which stays stable through cosmetic reordering elsewhere in the payload and changes when a parameter is renamed or an enum narrowed [14].
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.
Agents call tools/list once, often cached for the session and sometimes cached across sessions, read each tool's name, description and inputSchema, and use that to decide which tool to call and how to shape the arguments; that contract is the entire interface.
An MCP server can ship a change that breaks every agent calling it and nothing in conventional monitoring notices: the endpoint still answers 200, the initialize handshake still completes, and tools/list still returns a result, so every signal an uptime check knows how to read stays green.
Drift is defined as a server's tool inventory or a tool's input schema changing between two points in time, with no transport-level symptom at all; it is anything about a server's advertised capability contract that differs from the last time you checked.
When a tool disappears from tools/list, any agent that calls it gets a JSON-RPC error mid-flight, not at startup, and the failure shows up wherever the agent happens to reach for that tool.
A tool appearing is informational on its own but worth recording, because it is also how you notice a server quietly forking its capability set per client or per deploy.
A tool can keep the same name but change its inputSchema: a field renamed, a type narrowed, a new required parameter, or a changed description that alters how an LLM decides to call it. The tool is still callable, which makes this the dangerous case: nothing errors immediately, calls just start failing validation or getting silently misinterpreted.
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.
Mechanically checkable reasoning, single self-published source
The core argument is protocol-mechanical and reproducible by inspection — tools/list returns name, description and inputSchema; agents cache it; a removed tool yields a JSON-RPC error at call time; a same-name schema change is well-formed — and the create_ticket example demonstrates the silent case concretely. But the cluster has exactly one source, self-published by the vendor selling the remedy, with no incident reports, no drift-frequency measurement and no independent replication, and its ecosystem-level assertions are unevidenced.
One vendor implementation, no external uptake evidence
The only adoption datapoint is the author describing its own shipped health checker computing and persisting these fingerprints between runs. No third-party users, customer names, install or scan counts, or independent deployments appear anywhere in the supplied material, so breadth of uptake is effectively unevidenced beyond the vendor's own tool.
Sound mechanism, overstated ecosystem framing
Mildly overstated. The structural claim — drift is a diff, so one-shot probes cannot see it — is well argued and modestly framed, and the piece explicitly de-escalates the informational categories (added tools, version bumps). Overstatement sits in the unmeasured generalizations that pair with the sales pitch: 'drift is not a hypothetical' without any incidence data, and 'MCP tool schemas have no equivalent gate today' without surveying existing contract-testing tooling.
Vendor-authored problem statement leading to its own product
The post is published on dev.to under the Merlonix account, defines a monitoring gap, then presents Merlonix's MCP health checker as the implementation of exactly the fingerprint-and-diff design it argues is required. Self-published developer-platform content carries no independent editorial gate, and the diagnosis directly serves the product being described.
Moderate-low: verifiable mechanics, one interested publisher
Confidence is limited by cluster shape rather than internal coherence. A single, commercially interested publisher supplies every claim, so nothing is cross-checked; however the protocol-level assertions are specific, internally consistent and independently verifiable by any reader against MCP behaviour, which keeps this above the floor.
build
Rate limit your MCP servers, because a retrying agent turns one error into a billing incident1 distinct publisher
build
The MCP transport your search results teach has been deprecated since March1 distinct publisher
build
MCP 2026-07-28 drops the `result` wrapper, and your unit tests will not notice1 distinct publisher
build
A ttlMs on tools/list is a promise, not a receipt1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 21, 2026