What changed in MCP, October 2026

MCP changes from 2026-09-20 to 2026-10-20: the Server Cards SEP is final, six official SDKs shipped releases, and Claude connectors and Devin Desktop now negotiate 2026-07-28.

Practitioner7 min readLast reviewed

On this page

This digest covers 2026-09-20 to 2026-10-20. It lists changes to the MCP specification, the official SDKs, the major clients and notable remote servers. Each item links its source. Anything that could not be verified from a primary source dated in the window is left out.

Specification

The window has no new specification revision. 2026-07-28 is still current, and the draft changelog (opens in a new tab) has no new entries.

  • SEP-2127, MCP Server Cards, is Final (PR #2127 (opens in a new tab), merged 2026-10-06). An Extensions Track SEP with the identifier io.modelcontextprotocol/server-card. A Server Card is a static JSON document that describes a remote server before anyone connects to it: its name, version, transport endpoints and supported protocol versions. The recommended location is <streamable-http-url>/server-card. For domain-level discovery, an AI Catalog at /.well-known/ai-catalog.json can link to or embed cards. When a card and a live server/discover result disagree, clients should prefer server/discover. The wire format lives in the extension repository (opens in a new tab), not in the SEP page (opens in a new tab).
  • SEPs now need prior discussion (PR #3336 (opens in a new tab), merged 2026-09-28). Before opening a SEP, its author must discuss it with the relevant working or interest group and link that discussion in the PR. The SEP guidelines (opens in a new tab) now require it.
  • The Ruby SDK moves to Tier 1 (PR #3248 (opens in a new tab), merged 2026-09-28). The SDK listing for 2026-07-28 and the draft changed. The application cites 67/67 server and 50/50 client conformance scenarios.
  • New guide: local server security (PR #3072 (opens in a new tab), merged 2026-10-05). Local server security (opens in a new tab) covers the machine-level threat model of stdio servers. It is documentation, not specification text.
  • Editorial changes. The example Client ID Metadata Document in the draft authorization pages now uses loopback IP literals (127.0.0.1, [::1]) instead of localhost in redirect_uris (PR #3384 (opens in a new tab)). The 2026-07-28 page keeps the published example.

SDK releases

SDKVersion (date)Changes you will notice
TypeScriptv2.2.0 (opens in a new tab) (2026-09-28)listTools() and the other list calls without a cursor follow nextCursor to the end. Machine-to-machine OAuth providers take expectedIssuer; leaving it out is deprecated. fetchToken() throws AuthorizationServerMismatchError when stored client information belongs to another authorization server.
TypeScriptv2.3.0 (opens in a new tab) (2026-10-02), v2.3.1 (opens in a new tab) (2026-10-05)Server.connect() rejects an instance that is already connected. A stateless transport handles one request, so a stateless server needs a new server and transport per request. HTTP client transports follow redirects only on the same origin unless redirectPolicy: 'follow' is set. New opt-in maxToolInputElements and expectedResource (token audience check); 2.3.1 adds expectedResource to server-legacy. allowedOrigins accepts <scheme>://* for browser-extension clients. A large single-event SSE result arrives much faster.
TypeScript 1.x1.30.1 (opens in a new tab) (2026-09-23), 1.31.0 (opens in a new tab) (2026-09-28), 1.32.0 (opens in a new tab) (2026-10-02)Backports: request body size limit and batch length bound (1.30.1), OAuth credentials bound to their issuer (1.31.0), same-origin redirects, maxToolInputElements and expectedResource (1.32.0). 1.32.1 (opens in a new tab) (2026-10-05) changed only documentation.
Pythonv2.3.0 (opens in a new tab) (2026-10-02)A tool with an invalid x-mcp-header annotation now fails at registration; before, 2026-07-28 clients silently dropped it. On 2025-era connections, empty _meta and params are no longer sent. New max_sse_event_size (default 1 MiB per event). Client.call_tool re-lists and retries once after -32020. An interactive OAuth login no longer counts toward request timeouts. Requires httpx2>=2.10.0.
Javav2.1.0 (opens in a new tab) (2026-10-16)Removes the 2024-11-05 protocol from Streamable HTTP. Rejects POST bodies that are not application/json. Adds session sweeping and keep-alive, and extensions on capabilities (SEP-2133). Patch releases v1.1.5 (opens in a new tab) and v0.18.5 (opens in a new tab) shipped the same day.
Javav2.2.0-M1 (opens in a new tab) (2026-10-16, milestone)A new stateless 2026-07-28 server in io.modelcontextprotocol.modern. It does not yet support a modern client, tasks or SEP-2243 custom headers.
Rust (rmcp)3.4.1 (opens in a new tab) to 3.6.0 (opens in a new tab) (2026-09-23 to 2026-10-20)3.5.0 (opens in a new tab) rejects duplicate SEP-2243 headers and matches explicit default ports in the Origin allowlist. 3.5.1 (opens in a new tab) defaults missing cache hints for 2026-07-28 peers. 3.6.0 follows same-origin 307/308 redirects, answers a session-less non-initialize POST with 400, cancels abandoned client requests and adds initial OAuth scope selection.
Rubyv1.6.0 (opens in a new tab) to v1.8.0 (opens in a new tab) (2026-09-21 to 2026-10-16)1.6.0 raises an error when Protected Resource Metadata is unreachable instead of falling back to legacy discovery. 1.8.0 adds OAuth 2.1 resource server support to StreamableHTTPTransport (JWT or RFC 7662 introspection, RFC 9728 metadata), and its client transports reject server messages without "jsonrpc": "2.0".
PHPv0.9.0 (opens in a new tab) (2026-10-18)Breaking: authorization is narrowed to the resource server role, and structuredContent is validated against outputSchema. stdio serves both protocol eras. CORS preflight passes the authorization middleware, and the default CORS headers allow Mcp-Method, Mcp-Name and Mcp-Param-*.

The Go (opens in a new tab), C# (opens in a new tab), Kotlin (opens in a new tab) and Swift (opens in a new tab) SDKs had no release in the window. Their latest releases are Go v1.8.0 (2026-09-14), C# v2.2.0 (2026-08-13), Kotlin 0.15.0 (2026-07-28) and Swift 0.12.1 (2026-05-07). The MCP Inspector (opens in a new tab) shipped 2.8.0 through 2.11.0.

Client changes

Only documented changes that affect remote servers are listed.

  • Claude. In the Claude Code changelog (opens in a new tab) (dates are the GitHub release dates):

    • 2.1.281 (2026-09-23) added URL-mode elicitation on 2026-07-28 connections.
    • 2.1.287 (2026-10-01) added URL prompts for servers on 2025-11-25. A server that no longer connects after this can set "bareElicitationCapability": true.
    • 2.1.288 (2026-10-02) prompts the user to re-authenticate when a server asks for more OAuth scope during a tool call.
    • 2.1.295 (2026-10-08) makes claude.ai connectors negotiate 2026-07-28 by default. 2.1.299 (2026-10-14) does the same for cloud session and Remote Control connectors and stops following HTTP redirects to claude.ai's connector proxy and Anthropic-hosted servers. MCP_PROTOCOL_NEGOTIATION=legacy opts out.
    • 2.1.302 (2026-10-16) fixed servers that negotiate 2026-07-28 but omit resultType, ttlMs or cacheScope, which had shown no tools or failed every call.

    The Claude release notes (opens in a new tab) have no documented connector changes in the window.

  • ChatGPT. No documented changes. The Apps SDK changelog (opens in a new tab) has no entries in the window.

  • Cursor. No documented changes in the Cursor changelog (opens in a new tab).

  • VS Code. No changes specific to remote servers. 1.140 (opens in a new tab) (2026-09-30) can write servers to portable configuration files from MCP: Add Server. 1.141 (opens in a new tab) (2026-10-07, preview) lists servers supplied by extensions and plugins in the Agent Customizations editor.

  • Windsurf (now Devin Desktop). In the changelog (opens in a new tab), 3.10.67 (2026-10-12) connects to servers on 2026-07-28 (server/discover, no initialize). As a private preview, it can also reach remote servers configured in Devin Cloud.

  • Gemini CLI. No documented changes affecting remote servers in v0.61.0 to v0.64.0 (opens in a new tab).

  • Codex.

Remote servers

What to do about it

  • If your server sits behind a redirect to another host or port, publish the final URL. TypeScript SDK 2.3.0 and 1.32.0 clients no longer follow those redirects by default, and Claude Code no longer follows redirects to its connector proxy or Anthropic-hosted servers.
  • If you build on the TypeScript SDK 2.3.0, never call connect() on a server that is already connected; the second call now fails. With a stateless transport, create the server and the transport per request. With a stateful transport, keep connecting each session's server to its transport once and route that session's requests to the same transport; don't recreate them per request.
  • Test your server on 2026-07-28 now that claude.ai connectors and Devin Desktop negotiate it by default. Check that results carry the fields 2026-07-28 expects, and that every x-mcp-header parameter is a plain string, integer or boolean.
  • If tokens need more scope for some tools, answer with an insufficient_scope challenge. Claude Code and Cloudflare's server now handle step-up instead of failing.
  • To make your remote server discoverable before connection, read SEP-2127 (opens in a new tab) and consider serving a Server Card at <your-endpoint>/server-card.

Try it

To see which protocol version your server negotiates and what each revision changed, read MCP protocol versions explained.