Lesson 3 of 5 in Tool Selection at Scale: Forty Tools, One Context.
MCP made tool catalogs composable, and composition is where large catalogs actually come from. Nobody writes forty tools; a host connects to nine servers that each export a handful, and the pile assembles itself. Which raises a question the protocol answers precisely — and not in the way people assume.
Read that carefully, because two different namespaces are in play and only one of them is protected. Server identity is verifiable through the registry. Tool names inside a server are whatever that server says they are — and when your host flattens nine servers into one array for the model, collisions are not a hypothetical. Two servers exporting search. Three exporting create_issue. Your client must pick a rule, and the rule leaks into the model’s prompt, because the prefixed name is what the model reads and reasons about.
Disambiguation strategies your host can adopt, and what each does to the model’s job
Strategy
What the model sees
Verdict
First server wins
search — with no hint that a second search was silently dropped
Avoid. The dropped tool becomes a ghost: present in the catalog, unreachable, and invisible in any audit. Connection order becomes load-bearing configuration
Server prefix
github__search, confluence__search
The default worth adopting. Collisions become impossible, provenance becomes readable in the trace, and the prefix is a genuine routing signal — the model learns which system it is talking to
Prefix only on collision
search and confluence__search
Tempting, and unstable: adding a server silently renames a tool the model was already using. Tool names are part of your prompt surface — treat a rename as a change that needs testing
Curated aliases
search_code, search_docs — names you chose, mapped to servers in config
Best routing quality, highest maintenance. Worth it for the ten tools that carry your core workflows; not worth it for the long tail
Provenance is the other half. When create_issue fires, three questions should be answerable from the trace alone: which server executed it, which credential it used, and what description was in context when the model chose it. The first two are ordinary span attributes. The third is the one teams omit and later wish they had, because it is the only way to reconstruct why a past run made a choice that today’s catalog would not produce.