server/discover lets a client query a server’s supported protocol versions,
capabilities, and identity before sending any other requests. Servers MUST
implement it.
Request
The request carries no body parameters beyond the standard _meta:
Response
The server replies with its supported protocol versions, capabilities, and
identity. This operation supports caching.
When to Call
Calling server/discover is optional for clients — a client may invoke any
RPC inline and handle
UnsupportedProtocolVersionError
if the server does not support the requested version. However, server/discover
is useful in two scenarios:
- Presenting server information. While a client doesn’t need to call
server/discover to use the server, it’s a convenient way to retrieve the
server’s identity, capabilities, and supported versions in a single request.
For example, a client can present the capabilities a server supports from a
single server/discover response instead of probing with separate
tools/list, prompts/list, and resources/list requests.
- stdio backward-compatibility probe. On stdio, there is no per-request
HTTP status code to drive fallback. A client that supports both modern
(per-request
_meta) and legacy (initialize handshake) servers SHOULD
send server/discover first; see
stdio: Backward Compatibility
for the fallback rules.
See Protocol Version Negotiation
for the full version-selection flow. For HTTP-specific status codes returned for
unknown methods, see the Protocol Version Header
section in Transports.
Data Types
DiscoverResult
A discovery result includes:
supportedVersions: Protocol versions the server supports. The client should
choose one of these for subsequent requests.
capabilities: Capabilities the server supports (tools, resources, prompts,
etc.)
_meta['io.modelcontextprotocol/serverInfo']: Name and version of the server
software. Servers SHOULD include this field.
instructions: Optional natural-language guidance for LLMs on how to use
this server effectively
serverInfo is self-reported by the server and is not verified by the
protocol. It is intended for display, logging, and debugging. Clients SHOULD
NOT use it to change their behavior, and SHOULD NOT rely on it for
security decisions.