主题
能力发现(Discovery)
server/discover 让客户端在发送任何其他请求之前,先查询服务端支持的协议版本、能力与身份。 服务端 MUST(必须)实现它。
请求(Request)
除了标准的 _meta 之外,该请求不携带任何 body 参数:
json
{
"jsonrpc": "2.0",
"id": "discover-1",
"method": "server/discover",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "ExampleClient",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}响应(Response)
服务端回以自己支持的协议版本、能力与身份。该操作支持缓存。
json
{
"jsonrpc": "2.0",
"id": "discover-1",
"result": {
"resultType": "complete",
"supportedVersions": ["2026-07-28"],
"capabilities": {
"tools": {},
"resources": {}
},
"_meta": {
"io.modelcontextprotocol/serverInfo": {
"name": "ExampleServer",
"version": "1.0.0"
}
},
"instructions": "This server provides weather and resource utilities.",
"ttlMs": 3600000,
"cacheScope": "public"
}
}何时调用(When to Call)
对客户端而言,调用 server/discover 是可选的 —— 客户端可以直接内联发起任意 RPC, 并在服务端不支持所请求版本时处理 UnsupportedProtocolVersionError。 不过在两种场景下 server/discover 很有用:
- 展示服务端信息。 虽然客户端不调用
server/discover也能使用该服务端,但它是一次请求就拿到 服务端身份、能力与支持版本列表的便捷方式。例如,客户端可以仅凭一个server/discover响应 就展示出服务端支持哪些能力,而不必分别用tools/list、prompts/list、resources/list去逐个探测。 - stdio 上的向后兼容探测。 在 stdio 上没有"逐请求的 HTTP 状态码"可用来驱动回退。 同时支持现代(逐请求
_meta)与传统(initialize握手)服务端的客户端 SHOULD(应当) 先发送server/discover;回退规则见 stdio:向后兼容。
完整的版本选择流程见 协议版本协商。 关于未知方法在 HTTP 上返回哪些状态码,见传输章节中的 协议版本头。
数据类型(Data Types)
DiscoverResult
发现结果包含:
supportedVersions:服务端支持的协议版本。客户端应从中挑选一个用于后续请求。capabilities:服务端支持的能力(tools、resources、prompts 等)。_meta['io.modelcontextprotocol/serverInfo']:服务端软件的名称与版本。服务端 SHOULD(应当)包含该字段。instructions:可选的、面向 LLM 的自然语言指引,说明如何有效使用该服务端。
NOTE
serverInfo 由服务端自报,协议不做验证。它的用途是展示、日志与调试。 客户端 SHOULD NOT(不应当)据此改变自身行为,也 SHOULD NOT 将其用于任何安全决策。