---
title: "MCP compatibility matrix"
description: "What each MCP client puts on the wire, and what it presents when it gets there. Every cell cites a source and the date someone checked it."
canonicalUrl: "https://zuplo.com/learn/mcp/compatibility"
sourceUrl: "https://zuplo.com/learn/mcp/compatibility"
pageType: "other"
generatedAt: "2026-10-21"
---

# MCP compatibility matrix

> What each MCP client puts on the wire, and what it presents when it gets there. Every cell cites a source and the date someone checked it.

Current as of MCP 2026-07-28.

## Why this matters

Check the clients your callers use before you decide how your MCP server authenticates. A client that doesn't run the specification's OAuth flow needs a header instead. A client that never sends the RFC 8707 `resource` parameter can't obtain a token bound to your server, so an audience check you rely on will reject every call it makes. Both facts are per client, and neither is in the specification.

## How to read a cell

- **Yes**: The client's own documentation, source, or release notes state that it supports this.
- **Partial**: Supported with a condition that changes how you build against it. Every partial cell has a note naming the condition and citing it.
- **No**: The client's own documentation or source states that it doesn't support this.
- **Unknown**: No primary source states it either way. Read it as missing evidence, not as a no.

An unsourced cell is worse than a missing one, so a capability nobody documents is marked unknown rather than guessed at. Of 220 client capability cells, 176 cite a primary source and 44 are explicitly unknown. Every client name below links to that client's own page, which carries the note behind its cells, every caveat, and a source for each one.

## What 2026-07-28 changed

The 2026-07-28 revision changes what two columns mean. Dynamic client registration (RFC 7591) is deprecated, and the specification names Client ID Metadata Documents as the replacement, so a Yes in the Registration column records what a client does rather than what the specification recommends. Sending the RFC 8707 `resource` parameter became a client MUST: clients send it whether or not the authorization server supports it.

Adoption is real on the server side and thin on the client side, and that asymmetry is the most useful thing on this page. The revision shipped with launch partners, including Amazon Bedrock AgentCore, Prefect Horizon, Runlayer and mcp-use, and Cloudflare says its Agents SDK supports the specification from day zero. GitHub's MCP server shipped support on July 23, 2026, ahead of the release. So a server can speak 2026-07-28 today.

The clients can't yet. Of the 22 rows here, 2 reach 2026-07-28: MCP Inspector 2.0.0, MCP Python SDK 2.0.0. 8 publish an older revision, 12 publish none at all, and Anthropic's own wording is that support is rolling out across Claude products. So build your server to prefer the current revision and still accept the `initialize` handshake.

The legacy HTTP+SSE transport is deprecated rather than removed. The specification's lifecycle policy has it deprecated since 2025-03-26 and eligible for removal in a future revision, which is why it's still a column here.

- [Specification: authorization](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization)
- [Specification: client registration](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization/client-registration)
- [Revision announcement](https://blog.modelcontextprotocol.io/posts/2026-07-28/)
- [GitHub MCP server changelog](https://github.blog/changelog/2026-07-23-github-mcp-server-supports-the-next-mcp-specification/)

## Transports and protocol revision

Whether a client can reach your server, and which revision it puts on the wire.

| Client | Type | stdio | Streamable HTTP | Legacy HTTP+SSE | Protocol revision |
|---|---|---|---|---|---|
| [claude.ai, Claude Desktop, mobile, and Cowork connectors](/learn/mcp/compatibility/clients/claude-connectors) | Hosted connector runtime | Partial | Yes | Unknown | initialize era |
| [ChatGPT connectors and apps](/learn/mcp/compatibility/clients/chatgpt-connectors) | Hosted connector runtime | Partial | Yes | Unknown | Not published |
| [Claude Code](/learn/mcp/compatibility/clients/claude-code) | Terminal agent | Yes | Yes | Partial | initialize era |
| [Claude Agent SDK](/learn/mcp/compatibility/clients/claude-agent-sdk) | SDK | Yes | Yes | Yes | initialize era |
| [Claude Managed Agents](/learn/mcp/compatibility/clients/claude-managed-agents) | Hosted agent runtime | No | Yes | Partial | initialize era |
| [Messages API MCP connector](/learn/mcp/compatibility/clients/messages-api-mcp-connector) | API | No | Yes | Yes | 2025-11-25 |
| [OpenAI Responses API mcp tool](/learn/mcp/compatibility/clients/openai-responses-api) | API | No | Yes | Yes | Not published |
| [Microsoft Copilot Studio](/learn/mcp/compatibility/clients/copilot-studio) | Automation platform | No | Yes | No | Not published |
| [Codex CLI](/learn/mcp/compatibility/clients/codex-cli) | Terminal agent | Yes | Yes | No | Not published |
| [Gemini CLI](/learn/mcp/compatibility/clients/gemini-cli) | Terminal agent | Yes | Yes | Yes | 2025-06-18 |
| [Cursor](/learn/mcp/compatibility/clients/cursor) | Editor | Yes | Yes | Yes | Not published |
| [VS Code and GitHub Copilot](/learn/mcp/compatibility/clients/vs-code) | Editor | Yes | Yes | Partial | 2025-11-25 |
| [Devin Desktop, legacy Cascade agent](/learn/mcp/compatibility/clients/devin-desktop-cascade) | Editor | Yes | Yes | Yes | Not published |
| [Devin CLI](/learn/mcp/compatibility/clients/devin-cli) | Terminal agent | Yes | Yes | Partial | Not published |
| [Zed](/learn/mcp/compatibility/clients/zed) | Editor | Yes | Yes | Unknown | 2025-11-25 |
| [JetBrains AI Assistant](/learn/mcp/compatibility/clients/jetbrains-ai-assistant) | Editor | Yes | Yes | Partial | Not published |
| [MCP Inspector 2.0.0](/learn/mcp/compatibility/clients/mcp-inspector) | Reference tooling | Yes | Yes | Unknown | 2026-07-28 |
| [mcp-remote 0.1.38](/learn/mcp/compatibility/clients/mcp-remote) | Bridge | Yes | Yes | Yes | 2025-11-25 at most |
| [MCP TypeScript SDK 1.29.0](/learn/mcp/compatibility/clients/typescript-sdk-1x) | Reference SDK, 1.x line | Yes | Yes | Yes | 2025-11-25 |
| [MCP Python SDK 1.29.0](/learn/mcp/compatibility/clients/python-sdk-1x) | Reference SDK, 1.x line | Yes | Yes | Yes | 2025-11-25 |
| [MCP TypeScript SDK 2.0.0](/learn/mcp/compatibility/clients/typescript-sdk) | Reference SDK, 2.x line | Yes | Yes | Yes | 2025-11-25 |
| [MCP Python SDK 2.0.0](/learn/mcp/compatibility/clients/python-sdk) | Reference SDK, 2.x line | Yes | Yes | Yes | 2026-07-28 |

## Authorization mechanisms

What a client can present as a credential, and how it obtains one.

| Client | Runs the OAuth flow | Registration (RFC 7591) | Metadata document | Pre-registered client ID | Sends `resource` (RFC 8707) | Validates `iss` (RFC 9207) | Custom headers |
|---|---|---|---|---|---|---|---|
| [claude.ai, Claude Desktop, mobile, and Cowork connectors](/learn/mcp/compatibility/clients/claude-connectors) | Yes | Yes | Yes | Yes | Yes | Unknown | Partial |
| [ChatGPT connectors and apps](/learn/mcp/compatibility/clients/chatgpt-connectors) | Yes | Yes | Yes | Yes | Yes | Unknown | No |
| [Claude Code](/learn/mcp/compatibility/clients/claude-code) | Yes | Yes | Yes | Yes | Yes | Unknown | Yes |
| [Claude Agent SDK](/learn/mcp/compatibility/clients/claude-agent-sdk) | No | No | No | No | No | No | Yes |
| [Claude Managed Agents](/learn/mcp/compatibility/clients/claude-managed-agents) | No | No | No | Partial | Unknown | Unknown | No |
| [Messages API MCP connector](/learn/mcp/compatibility/clients/messages-api-mcp-connector) | No | No | No | No | No | No | No |
| [OpenAI Responses API mcp tool](/learn/mcp/compatibility/clients/openai-responses-api) | No | No | No | No | No | No | No |
| [Microsoft Copilot Studio](/learn/mcp/compatibility/clients/copilot-studio) | Yes | Yes | Unknown | Yes | Unknown | Unknown | Unknown |
| [Codex CLI](/learn/mcp/compatibility/clients/codex-cli) | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | Yes |
| [Gemini CLI](/learn/mcp/compatibility/clients/gemini-cli) | Yes | Yes | No | Yes | Yes | No | Yes |
| [Cursor](/learn/mcp/compatibility/clients/cursor) | Yes | Yes | Unknown | Yes | Unknown | Unknown | Partial |
| [VS Code and GitHub Copilot](/learn/mcp/compatibility/clients/vs-code) | Yes | Yes | Partial | Yes | Partial | Unknown | Yes |
| [Devin Desktop, legacy Cascade agent](/learn/mcp/compatibility/clients/devin-desktop-cascade) | Yes | Unknown | Unknown | Unknown | Unknown | Unknown | Yes |
| [Devin CLI](/learn/mcp/compatibility/clients/devin-cli) | Yes | Yes | Unknown | Yes | Yes | Unknown | Yes |
| [Zed](/learn/mcp/compatibility/clients/zed) | Yes | Yes | Yes | No | Yes | Unknown | Yes |
| [JetBrains AI Assistant](/learn/mcp/compatibility/clients/jetbrains-ai-assistant) | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown | Unknown |
| [MCP Inspector 2.0.0](/learn/mcp/compatibility/clients/mcp-inspector) | Yes | Yes | Unknown | Yes | Unknown | Unknown | Yes |
| [mcp-remote 0.1.38](/learn/mcp/compatibility/clients/mcp-remote) | Yes | Yes | Unknown | Yes | Unknown | Unknown | Yes |
| [MCP TypeScript SDK 1.29.0](/learn/mcp/compatibility/clients/typescript-sdk-1x) | Yes | Yes | Partial | Yes | Partial | No | Yes |
| [MCP Python SDK 1.29.0](/learn/mcp/compatibility/clients/python-sdk-1x) | Yes | Yes | Yes | Yes | Yes | No | Yes |
| [MCP TypeScript SDK 2.0.0](/learn/mcp/compatibility/clients/typescript-sdk) | Yes | Yes | Yes | Yes | Yes | Unknown | Yes |
| [MCP Python SDK 2.0.0](/learn/mcp/compatibility/clients/python-sdk) | Yes | Yes | Yes | Yes | Yes | Yes | Yes |

Client support last verified July 31, 2026 against the 2026-07-28 revision. That is the oldest date across these rows, so a stale row can't hide behind a fresher one.

## Where clients disagree, and what it costs you

No cell can show these, because each one is a difference between clients rather than a fact about any single client. Each also decides something you have to build around.

### The `resource` parameter splits three ways

Zed, Gemini CLI, and the Python SDK send `resource` unconditionally. VS Code and anything on the TypeScript SDK 1.x line send it only after discovering RFC 9728 protected resource metadata, so a server that publishes none never receives it. Devin CLI sends it by default and lets you switch it off. If your server validates a token audience, that one column decides whether a client can ever obtain a token you'll accept.

### The `iss` check has reached one row

The 2026-07-28 revision makes validating a present RFC 9207 `iss` a client MUST. The check landed in the reference SDKs' 2.x line, and the MCP Python SDK 2.0.0 is the only row here that has it — every other client pins 1.x or publishes no revision, so the column reads No or Unknown across the rest of the table. Read that as a gap the ecosystem has not closed yet rather than a fault in any one client, and don't assume a caller validated the issuer for you.

### The two hosted runtimes disagree about static credentials

ChatGPT refuses machine-to-machine grants, service accounts, JWT bearer assertions, custom API keys, and customer-supplied client certificates, and says so outright. claude.ai refuses the machine-to-machine grant too, but offers a beta request-header path with an allowlist of header names. So a server that authenticates with an API key can reach one of them, conditionally, and not the other.

### A header can win or lose against OAuth discovery

Zed treats a configured `Authorization` header as a decision and skips the OAuth flow. Cursor starts the flow first and never sends the header, which its own staff confirmed as a bug. Claude Code does something different again: a rejected `Authorization` header fails the connection rather than falling back. Same configuration, three outcomes.

## What this page doesn't cover

### Clients not listed

Agent frameworks and automation platforms aren't here yet: the OpenAI Agents SDKs, LangChain's MCP adapters, the Vercel AI SDK, Pydantic AI, Mastra, CrewAI, AutoGen, Semantic Kernel, n8n, and Zapier. Neither are Cline, Continue, Goose, LibreChat, Antigravity, Amazon Q Developer, Kiro, Warp, or JetBrains Air. A client lands on this page when every column can be answered from its own documentation, source, or release notes — a half-sourced row is worse than an absent one, because the value of the grid is that each cell is checkable.

One inheritance rule covers most of the missing names in the meantime. A framework that delegates MCP to a reference SDK inherits that SDK's cells, so the two 1.x rows in these tables are the ceiling for anything pinned to the 1.x line.

### Protocol features

Sampling, elicitation, roots, logging, progress, structured output, tool annotations, and the tasks extension aren't columns here. The 2026-07-28 revision deprecates three of them and replaces server-initiated requests with multi-round-trip requests, so one grid would describe two different wires at once and read as a single answer.

### Metadata documents per identity provider

The [provider table](/learn/mcp/compatibility/identity-providers) has no column for client ID metadata documents. That support isn't verified per provider yet, and until it is, the column would be unknown end to end. Its Registration column records what each provider does, which is a different question from what the current revision recommends.

### Tool caps and timeouts

Three tool caps here have a current citable source — VS Code's and Copilot Studio's 128, and Cascade's 100 — and they sit in those clients' notes rather than in a column. Widely repeated numbers for other clients trace back to forum threads and appear in no current documentation, so they're absent. The most-repeated of them, a 40-tool cap for Cursor, is named in Cursor's notes precisely so nobody reads its blank cell as a confirmation.

### Errors these gaps produce

When a mismatch in these tables turns into a failed connection, the string your client printed is in the [MCP error reference](/learn/mcp/errors).

## The detail behind the cells

- [Clients](/learn/mcp/compatibility/clients): Notes and sources by client. One page per client: what its cells mean in practice, every caveat with the source that qualifies it, and the revision it puts on the wire.
- [Identity providers](/learn/mcp/compatibility/identity-providers): Dynamic client registration and resource indicators, per provider, with the workaround where a provider says no.
- [Back to Learn MCP](/learn/mcp)

## Next steps

A gateway in front of your MCP servers answers discovery, binds token audiences, and validates tokens once — for every server and every client in this matrix.

- [Start for Free](https://portal.zuplo.com/signup)
- [Read the Docs](https://zuplo.com/docs/mcp-gateway/code-config/overview)
