Skip to content

405 Method not allowed on GET /mcp

Spec
2025-11-25 → 2026-07-28
Evidence
E2Reproducedarm64
TypeScript SDK (server)
@modelcontextprotocol/server@2.4.0
Python SDK
mcp@2.3.0
Verified

The 2026-07-28 Streamable HTTP transport has one endpoint that accepts POST only. The specification says a server that receives GET or DELETE on it should answer 405 Method Not Allowed. A TypeScript SDK v2 server built with createMcpHandler did exactly that:

HTTP/1.1 405 Method Not Allowed
{"jsonrpc":"2.0","error":{"code":-32000,"message":"Method not allowed."},"id":null}

Servers differ. The Python SDK 2.3.0 answered the same GET with 400 and Bad Request: Missing session ID (see that entry), and a TypeScript server that only registers app.post('/mcp') in Express answered 404.

A browser sends GET. Seeing 405 there is normal and means the server is running. Test with a real client instead: the Inspector CLI or the curl requests in the SSE migration guide.

Two kinds of older clients send GET:

  • HTTP+SSE clients (2024-11-05). They open GET /sse and wait for an endpoint event. Point them at a server that still offers SSE, or move the client to Streamable HTTP.
  • 2025 Streamable HTTP clients that open a standalone GET stream for server notifications. In 2026-07-28 this is replaced by subscriptions/listen, a POST request whose response stays open.

If the URL in the client ends in /sse, it is configured for the old transport.

Terminal window
curl -i http://127.0.0.1:8000/mcp

Any of the answers above (405, 400 Missing session ID, 404) means a web server is listening, and the problem is the method or the path, not the network. If curl reports Connection refused, see fetch failed instead. To check the MCP side, send a POST as shown in 415 Unsupported Media Type.

Sources

MCPDev is community documentation. It is not affiliated with the Model Context Protocol project or with the vendors of the clients it covers.