For brevity, the request examples on this page omit the
_meta request
metadata (io.modelcontextprotocol/protocolVersion,
io.modelcontextprotocol/clientInfo, and
io.modelcontextprotocol/clientCapabilities). Every request MUST include
the required _meta fields; see
_meta.User Interaction Model
Tools in MCP are designed to be model-controlled, meaning that the language model can discover and invoke tools automatically based on its contextual understanding and the user’s prompts. However, implementations are free to expose tools through any interface pattern that suits their needs—the protocol itself does not mandate any specific user interaction model.Capabilities
Servers that support tools MUST declare thetools capability:
listChanged indicates whether the server will emit notifications when the list of
available tools changes.
Servers that declare the tools capability MUST respond to tools/list requests
with the set of tools currently available to the requesting client. This set MAY be
empty and MAY change over time (see
List Changed Notification), but MUST NOT vary
per-connection or as a side effect of other requests on the connection. The set
MAY vary by the authorization presented on the request — for example, returning
only the tools the caller’s granted scopes permit — since credentials are
per-request input, not connection state.
Servers SHOULD return tools in a deterministic order (i.e., the same ordering across
requests when the underlying set of tools has not changed). Deterministic ordering enables
clients to reliably cache the tool list and improves LLM prompt cache hit rates when tools
are included in model context.
Protocol Messages
Listing Tools
To discover available tools, clients send atools/list request. This operation supports
pagination and caching.
Request: