Streamable HTTP: malformed requests return raw pydantic errors to the client
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 78/100
Línea de trabajo
El texto crudo de pydantic y de parseo JSON proviene del manejador POST en src/mcp/server/streamable_http.py, alrededor de las líneas 580-596. La ruta 2026-07-28 en _streamable_http_modern.py (alrededor de la línea 415) ya devuelve mensajes fijos, así que copia ese patrón. Ejecuta el script de ejemplo para ver los cuerpos actuales y luego comprueba que una entrada malformada devuelva el texto fijo «Parse error» o «Invalid JSON-RPC message», mientras que los detalles solo van al registro del servidor. Añade pruebas para los casos de jsonrpc ausente y de contenido que no es JSON, y comprueba el mismo cambio en v1.x.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Initial Checks
- I confirm that I'm using the newest release of my line (the latest 2.x, or the latest 1.x if I'm still on v1)
- I confirm that I searched for my issue in https://github.com/modelcontextprotocol/python-sdk/issues before opening this issue
Release line
2.x (current stable)
Also applies to latest 1.x
Description
When the Streamable HTTP POST handler rejects a malformed body, it returns the raw exception text to the client (streamable_http.py L580-L596):
- No
"jsonrpc"field →"Validation error: 6 validation errors for union[JSONRPCRequest,...] ... input_value={...} ... https://errors.pydantic.dev/2.14/v/missing" - Not JSON →
"Parse error: EOF while parsing a value at line 1 column 27"
A security audit of our MCP server flagged this: the errors reveal that the backend is Python, using pydantic (down to the exact version) and the MCP Python SDK, which helps an attacker enumerate the environment.
Expected: fixed messages (Parse error, Invalid JSON-RPC message), with detail in the server log only. The 2026-07-28 path already does this (_streamable_http_modern.py L415).
The same code is on v1.x, which we run. I’d like to fix both if assigned: a few lines plus tests, with no new API.
Related: #3557 (error code on these lines), #3572 (same pydantic text in tool-argument errors).
Disclosure: this issue was drafte by Claude Code and reviewed/iterated by myself and another senior developer. I ran the reproduction and verified the output myself.
Example Code
import json
from mcp.server import MCPServer
from mcp.server.transport_security import TransportSecuritySettings
from starlette.testclient import TestClient
server = MCPServer("repro")
@server.tool()
def echo(text: str) -> str:
return text
app = server.streamable_http_app(
stateless_http=True,
transport_security=TransportSecuritySettings(enable_dns_rebinding_protection=False),
)
headers = {
"Accept": "application/json, text/event-stream",
"Content-Type": "application/json",
"mcp-protocol-version": "2025-06-18",
}
with TestClient(app) as client:
for body in (
json.dumps({"id": 1, "method": "tools/call", "params": {"name": "echo", "arguments": {"text": "hi"}}}),
json.dumps([{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}]),
'{"jsonrpc": "2.0", "id": 1,',
):
response = client.post("/mcp", content=body, headers=headers)
print(response.status_code, json.dumps(response.json(), indent=2))
Python & MCP Python SDK
Python 3.12.9
mcp 2.3.0
pydantic 2.14.0
- Lenguaje dominante
- Python
- Estrellas
- 24.5k
- Forks
- 4k
- Merge medio
- 18 h 31 min
- PR fusionados (30 d)
- 38
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de modelcontextprotocol/python-sdk
-
2026-07-28 SSE responses share one header list, so in-place middleware appends leak across responsesQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertobug spec-2026-07-28 v2
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
modelcontextprotocol/python-sdk#3701 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Streamable HTTP: Content-Type handling is order dependent and accepts invalid valuesPosiblemente ocupada @jayzuccarelli la tomó hace 3 días. Abiertobug v1 v2
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
modelcontextprotocol/python-sdk#3691 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Skills: URI traversal validation skips percent-encoded dot-segmentsPosiblemente ocupada @Varshith-Kali la tomó hace 2 días. Abiertobug v2
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
modelcontextprotocol/python-sdk#3685 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Type annotation gaps and unhandled FileNotFoundError in src/mcp/cli/cli.pyQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertoenhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
modelcontextprotocol/python-sdk#3673 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
-
Streamable HTTP server rejects a mixed-case Content-Type with 415Posiblemente ocupada @CRYPTONIKAV la tomó hace 5 días. Abiertobug v1 v2
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
modelcontextprotocol/python-sdk#3670 · 4 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de modelcontextprotocol/python-sdk
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
huggingface/sentence-transformers#4186 ·
Los mantenedores suelen responder en 5 días
-
documentation
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
QuantEcon/QuantEcon.py#988 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
fabriziosalmi/certmate#1247 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
documentation good first issue
Dificultad 2/5 Medio día Aptitud para principiantes 72/100
sujithputta02/Esapay#13 ·