// scoped to a single server
The rule is in the spec's own tool-name section, and both halves of it matter:
Within a server — and SHOULD, not MUST. There is no registry, no reservation, nothing that stops the next server you install from shipping the same string. The spec says so directly, and picks the example everyone eventually hits:
search tool) and SHOULD implement a disambiguation strategy such as prefixing tool names with a server identifier.The failure is that it works
This is not a crash, and that is what makes it expensive. From the model's side the two tools are the same object: the same name, the same shape, nothing to prefer one over the other.
So it picks one. The call returns isError: false, the content is well-formed, the agent carries on. What you get is an answer sourced from the wrong system — which is much harder to notice than an exception, and much harder to notice late.
A tool's title does not rescue you either. The spec calls it an "Optional human-readable name of the tool for display purposes". The call goes by name.
Prefix them — but not with the server's own name
The mitigation is the obvious one: put a label in front, so the two become two.
The trap is in the very next sentence of the same spec note, and it disqualifies the prefix most people reach for first:
name (from serverInfo) is not guaranteed to be unique across servers and SHOULD NOT be relied upon for disambiguation.A server names itself. Two projects can pick search-server with no coordination and neither is wrong. So the identifier has to be one you assign, at the point you install the server — a key in your MCP config, not a string the server reports about itself.
What a name is allowed to be
The character rules are permissive enough that a prefix fits comfortably, and strict enough to be worth checking before you invent a separator.
Dot-separated prefixes (docs.search) and underscore ones (docs_search) are both inside the allowed set. Pick one and keep it, because the model reads the prefix as part of the name and an inconsistent scheme costs you the clarity you added it for.
If you write servers, assume aggregation
Your server is not the only one installed, and you do not get to see the others. Two habits cost nothing and remove most of the risk:
And keep the set of names stable. A renamed tool is, to the client's config, a different tool — whatever prefixing it had is now pointing at nothing.
Related: why your agent ignored the tool you gave it covers how to write a single tool so the model reaches for it — the problem this page describes is the one no description on your own server can fix, because you do not own the other one. What an MCP server actually is is the ground underneath, and tools versus resources is the other thing worth settling before you build one.
Source: Model Context Protocol specification (draft), Tools — Tool Names. Verified 2026-09-12.
One concept a week. Free.
The deeper, copy-paste version of each ToolCall short — in your inbox.
// total: 0.00 · spam: void · unsubscribe: one click
