Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Streamable HTTP: Content-Type handling is order dependent and accepts invalid values

Aberta Para iniciantes
#3,691 1 comentário 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@jayzuccarelli já está trabalhando nisso.

Desde 12/10/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
Ativa
Stack de tecnologia
python

Direção de pesquisa

Comece lendo as verificações de Content-Type em src/mcp/server/transport_security.py e src/mcp/server/streamable_http.py e, em seguida, rastreie a verificação correspondente no transporte moderno. Adicione ou atualize testes para os valores de Content-Type listados, incluindo parâmetros e valores separados por vírgulas. O trabalho estará concluído quando apenas application/json, com parâmetros opcionais, for aceito de forma consistente em todos os transportes.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

bug v1 v2
Initial Checks
Release line

2.x (current stable)

Description

The Content-Type header:

  • accepts values that are not JSON media types. application/json, text/plain is accepted and the request is executed, although a comma cannot appear inside a media type. On the modern transport application/jsonx is accepted as well
  • The answer depends on order. application/json, text/plain is accepted while text/plain, application/json is rejected, so the same invalid value gets opposite answers.

The first check is a prefix test in the middleware:

# src/mcp/server/transport_security.py
return content_type is not None and content_type.lower().startswith("application/json")

The second splits the value on ; and , and compares the result:

# src/mcp/server/streamable_http.py
content_type_parts = [part.strip() for part in content_type.split(";")[0].split(",")]
return any(part == CONTENT_TYPE_JSON for part in content_type_parts)

The second check rejects application/jsonx. The 2.x modern transport has no equivalent, so it accepts that value.

For reference, the TypeScript SDK answers 415 for application/json, text/plain and for application/jsonx, and mcp-go answers 400 for both.

Reproduction

Against a server started with stateless_http=True, so no session handshake is needed:

curl -s http://127.0.0.1:8901/mcp \
  -H 'Content-Type: application/json, text/plain' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ping","arguments":{}}}'

Observed: 200 with a normal JSON-RPC result, and the tool's handler runs.

Content-Type sent Expected handshake transport (1.x and 2.x) modern transport (2.x only)
application/json accepted 200 200
application/json; charset=utf-8 accepted 200 200
application/json, text/plain rejected 200, body executed 200, body executed
application/jsonx rejected 415 200, body executed
text/plain, application/json rejected 400 400
text/plain rejected 400 400

For modern transport calls were sent with MCP-Protocol-Version: 2026-07-28 plus the Mcp-Method and Mcp-Name headers.

Fix

Parse the media type, the segment before the first ;, and compare it exactly to application/json. Parameters keep working, so application/json; charset=utf-8 is unaffected, while the values above are rejected.

Python & MCP Python SDK
Reproduced on the 2.x line (`2.2.0`, `2.3.0`) and the 1.x line (`1.30.0`)
Linguagem predominante
Python
Estrelas
24.5k
Forks
4k
Merge médio
18h 31min
PRs com merge (30d)
38

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de modelcontextprotocol/python-sdk

Todas as issues de modelcontextprotocol/python-sdk

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.