MCP 2026-07-28: what changed, and why most tutorials are now out of date
Quick check: does the MCP tutorial you're following start with an initialize call? If yes, it's describing the previous protocol. The official site lists 2026-07-28 as the current revision (as of 19 October 2026), and the headline change is simple: the handshake and sessions are gone.
Before and after
| Older (2025-11-25 and earlier) | Current (2026-07-28) | |
|---|---|---|
| Starting a connection | initialize, then an initialized notification |
No handshake |
| State | A session tied to the connection | Every request stands on its own |
| Version and capabilities | Agreed once at the start | Sent in _meta on every request |
| Discovery | Part of the handshake | Optional server/discover request |
| Server-initiated requests | Allowed | Not used. "Multi round-trip requests" instead |
Source: the official MCP versioning page and the transports spec for 2026-07-28.
On Streamable HTTP the version also travels in the MCP-Protocol-Version header. A server can support several versions at once. If it gets one it doesn't know, it replies with an error listing the ones it does.
A real request and response
We didn't want to just describe this, so we ran it. The lines below come from a small Python MCP server (SDK package mcp 2.3.0) on 19 October 2026. We wrote raw JSON-RPC to it over stdio. --> is what we sent, <-- is what came back.
--> {"jsonrpc": "2.0", "id": 1, "method": "server/discover", "params": {"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {}}}}
<-- {"jsonrpc":"2.0","id":1,"result":{"cacheScope":"private","capabilities":{"prompts":{"listChanged":true},"resources":{"listChanged":true,"subscribe":true},"tools":{"listChanged":true}},"resultType":"complete","supportedVersions":["2026-07-28"],"ttlMs":0,"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"india-utils","version":""}}}}
--> {"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "gst_breakdown", "arguments": {"amount": 1180, "gst_rate_percent": 18, "amount_includes_gst": true}, "_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientCapabilities": {}}}}
<-- {"jsonrpc":"2.0","id":2,"result":{"content":[{"text":"{\n \"taxable_value\": 1000.0,\n \"gst_rate_percent\": 18,\n \"gst_amount\": 180.0,\n \"cgst\": 90.0,\n \"sgst\": 90.0,\n \"total\": 1180.0\n}","type":"text"}],"isError":false,"resultType":"complete","structuredContent":{"taxable_value":1000.0,"gst_rate_percent":18,"gst_amount":180.0,"cgst":90.0,"sgst":90.0,"total":1180.0},"_meta":{"io.modelcontextprotocol/serverInfo":{"name":"india-utils","version":""}}}}
Three things worth noticing:
server/discoveranswered withsupportedVersions: ["2026-07-28"]plus the server's capabilities. This server only speaks the new revision.tools/callworked with no handshake before it. The reply has readable text incontentand a proper object instructuredContent.- We got it wrong the first time. Our first attempt sent only the protocol version, and the server replied with error
-32602: "params._meta is missing the required envelope key(s): io.modelcontextprotocol/clientCapabilities". So in this SDK both keys are required on every request, even if capabilities is just{}. The SDK's ownClientclass fills them in for you, which is another reason not to hand-roll this.
So what should you do?
- Pin your SDK version, then check what
supportedVersionsyour server reports. - Need to serve older clients too? Use your SDK's documented compatibility option. Don't write your own handshake.
- If a tutorial talks about
initializeor anMcp-Session-Id, read it as history, not as how things work today.
Keep going
- MCP cheat sheet for 2026-07-28
- Build a Python MCP server
- The MCP Builder's Handbook teaches this revision first and keeps a short chapter on the old handshake for compatibility.
Frequently asked questions
What is the current MCP protocol revision?
As of 19 October 2026 the official site lists 2026-07-28 as current. Revisions are named after the date of the last breaking change.
Is the initialize handshake gone in MCP?
In revision 2026-07-28, yes. There is no initialize step and no connection session. Each request states its own protocol version and client capabilities. Older revisions (2025-11-25 and earlier) used the handshake.
What is server/discover?
A request that returns the server's supported protocol versions, capabilities and identity in one go. A client can call it first, or just send a request and handle a version error if one comes back.