StreamableHTTPClientTransport should handle 404 and 406 gracefully for GET SSE stream
Mantenedores costumam responder em até 1 dia
@nanookclaw já está trabalhando nisso.
Desde 27/4/2026.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 76/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Pouca atividade
- Stack de tecnologia
- typescript
- Domínio
- api, networking
Direção de pesquisa
Comece em packages/client/src/client/streamableHttp.ts, especificamente em StreamableHTTPClientTransport._startOrAuthSse(), e acompanhe como o status da resposta GET é tratado durante a inicialização. Verifique o comportamento com um servidor MCP POST-only ou com um teste de cliente focado, se disponível. Considera-se concluído quando 404 e 406, assim como 405, permitirem que a comunicação baseada em POST continue sem um erro fatal.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Problem
The StreamableHTTPClientTransport._startOrAuthSse() method sends a GET request to open an SSE stream during initialization. Per the MCP spec, the server MAY respond with 405 Method Not Allowed if it doesn't support SSE streams, and the client correctly handles this.
However, many MCP servers return 404 Not Found or 406 Not Acceptable instead of 405 for this GET request:
- 404: Server doesn't have a GET handler for the MCP endpoint (only POST)
- 406: Server rejects
Accept: text/event-streamheader (e.g., requires bothapplication/jsonandtext/event-stream)
Both cases mean the same thing: the server does not offer an SSE stream at the GET endpoint. But the client treats them as fatal errors, preventing the connection even though POST-based communication would work fine.
Current Behavior
// packages/client/src/client/streamableHttp.ts, _startOrAuthSse()
if (response.status === 405) {
return; // Only 405 is handled gracefully
}
throw new SdkError(...); // 404 and 406 throw, killing the connection
This causes errors like:
StreamableHTTPError: Streamable HTTP error: Failed to open SSE stream: Not Found
Affected Clients
This impacts any client consuming the SDK, including:
- Gemini CLI (
google-gemini/gemini-cli) — #5268, #2787 - MCP Inspector — #1150
- LibreChat and other MCP consumers
Proposed Fix
Treat 404 and 406 the same as 405 — all indicate the server does not offer an SSE stream at the GET endpoint:
// 404: Server has no GET handler (only POST)
// 405: Server explicitly doesn't allow GET
// 406: Server rejects the Accept header for GET
if (response.status === 404 || response.status === 405 || response.status === 406) {
return;
}
The client will then proceed with POST-based communication, which works correctly for these servers.
Reproduction
- Set up an MCP server that only supports POST (no GET SSE stream)
- Connect using
StreamableHTTPClientTransport - The GET request returns 404 → client throws and disconnects
- POST would have worked fine
Environment
@modelcontextprotocol/sdk: latest- Discovered while debugging Gemini CLI v0.32.1 connecting to a remote HTTP MCP server (ArmorCode)
- Linguagem predominante
- TypeScript
- Estrelas
- 13.7k
- Forks
- 2.4k
- Merge médio
- 1d 22h
- PRs com merge (30d)
- 18
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de modelcontextprotocol/typescript-sdk
-
[v2] createMcpHandler legacy fallback misses an abort that happens before it subscribesTalvez já em andamento @mariano-aguero assumiu há 5 dias. Abertav2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
modelcontextprotocol/typescript-sdk#3136 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
[v2] requireBearerAuth: drop error="invalid_token" when no credentials were sent and resource_metadata is set (RFC 6750 §3.1)Talvez já em andamento @Anandumv assumiu há 5 dias. Abertav2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
modelcontextprotocol/typescript-sdk#3124 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
-
The `maxToolInputElements` refusal lacks the `Input validation error:` prefix that the schema refusal carriesTalvez já em andamento @barry166 assumiu há 9 dias. Abertav1 v2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
modelcontextprotocol/typescript-sdk#3111 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
server: registeredResource.update and registeredResourceTemplate.update desync title and metadata.title when updating metadata aloneTalvez já em andamento @SameRainbows assumiu há 4 dias. Abertav1 v2
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
modelcontextprotocol/typescript-sdk#3103 · 6 comentários ·
Mantenedores costumam responder em até 1 dia
-
[v1.x] Protocol.request keeps its abort listener after the request resolved, so a later abort sends notifications/cancelled for an answered request (1.30.0)Talvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Abertav1
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
modelcontextprotocol/typescript-sdk#3090 · 2 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de modelcontextprotocol/typescript-sdk
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
vercel-labs/durable-harness#53 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
area/docs area/ui enhancement
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 88/100
melgarafael/DeskcommCRM#4098 ·
Mantenedores costumam responder em até 1 dia
-
bug ready-for-agent
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
kerti/balances-v2#801 ·
Mantenedores costumam responder em até 1 dia
-
lesson-submission pending-review
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 84/100
Ikalus1988/MisakaNet#4510 ·
Mantenedores costumam responder em até 1 dia