### `wai mcp` speaks MCP 2026-07-28, the stateless revision, beside the four it negotiates

- **No handshake.** A request whose `_meta` names its revision (`io.modelcontextprotocol/protocolVersion`)
  is served from what it carries alone, as MCP 2026-07-28 serves every request: its
  `io.modelcontextprotocol/clientCapabilities` is required (`-32602` without it), and a revision
  the server does not serve per request is refused `-32022` (`UnsupportedProtocolVersion`) with
  `data.supported`, the revisions a request may name, `data.requested`, and `data.initialize`,
  the revisions `initialize` negotiates. `supported` never holds the revision asked for, so a
  client that retries with one of them, as that error asks, is served rather than refused
  again. A revision `initialize` negotiates (2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05)
  named per request is refused so, and says so.
- **`server/discover`**, which that revision requires: the revisions the server speaks, newest
  first, its capabilities (`tools`) and its instructions.
- **Every result** of that revision carries `resultType` (`"complete"`) and the server's name and
  version in `_meta` (`io.modelcontextprotocol/serverInfo`); `server/discover` and `tools/list`
  carry `ttlMs` (an hour: what they state is fixed for the process's life) and `cacheScope`
  (`"public"`: nothing in them is a user's). `ping`, which that revision removed, is `-32601`
  under it.
- **The earlier revisions.** `initialize` opens a session in 2025-11-25, the last revision with
  a handshake, which it now negotiates (a client of it was moved down to 2025-06-18, and
  `server/discover`'s list skipped it): nothing these tools use changed in it. It still opens one
  in 2025-06-18, 2025-03-26 or 2024-11-05, and a request without the revision in its `_meta` is
  served under them; one process serves both, so a client of either era, or one that probes with
  `server/discover` and falls back to `initialize`, works with it.
- **The tools are the same in both**: the same list, the same calls and the same results, a
  tool's own error a result with `isError`.
