Client accepts JSON-RPC response containing both result and error
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 72/100
Línea de trabajo
Empieza rastreando el enum JsonRpcMessage sin etiqueta a través de JsonRpcResponse y la ruta de la solicitud call_tool. Reproduce la respuesta malformada descrita en el issue y, después, añade cobertura para una respuesta que contenga tanto result como error. Se considera terminado cuando la solicitud pendiente devuelve un error en lugar de Ok(CallToolResult), mientras se conserva el comportamiento de conexión indicado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
The rmcp 3.4.0 client accepts a malformed JSON-RPC response containing both result and error. It resolves the pending tools/call as Ok(CallToolResult), using the result and silently ignoring the error.
JSON-RPC responses must contain either result or error, not both.
Environment
- rmcp: 3.4.0 (
rmcp-v3.4.0, commitfd7811f) - rustc: 1.98.1
- macOS arm64
- Protocol: MCP
2026-07-28 - Transports: stdio and Streamable HTTP
To reproduce
- Connect an rmcp client to an MCP server.
- Send a
tools/callrequest. - Have the server return a response shaped like:
{
"jsonrpc": "2.0",
"id": 1,
"result": { "content": [], "resultType": "complete" },
"error": { "code": -32603, "message": "injected error" }
}
A minimal client call is:
let result = client
.call_tool(
CallToolRequestParams::new("malformed_message")
.with_arguments(
serde_json::json!({"variant": "result-with-error"})
.as_object()
.unwrap()
.clone(),
),
)
.await;
assert!(result.is_err());
This was found while testing MCP Failure Lab 0.9.0. The malformed_message tool intentionally returned a response containing both result and error.
I reproduced it with the mcp-failure-lab@0.9.0 package and the v0.9.0 Git tag over stdio and Streamable HTTP.
Expected behavior
The client rejects the response as an invalid JSON-RPC message and returns an error for the pending request. The connection may remain usable afterward.
Actual behavior
call_tool returns Ok(CallToolResult). A subsequent normal request succeeds.
Additional context
The likely parser path is the untagged JsonRpcMessage enum: JsonRpcResponse accepts the result shape while Serde ignores the unexpected error field.
Other tested official clients, including C# ModelContextProtocol 2.2.0, reject the same wire response.
- Lenguaje dominante
- Rust
- Estrellas
- 3.9k
- Forks
- 645
- Merge medio
- 4 d 22 h
- PR fusionados (30 d)
- 37
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/rust-sdk
-
streamable-http server: a supplied Mcp-Method contradicting an initialize body is silently accepted Abiertobug P1 ready for work T-transport
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
modelcontextprotocol/rust-sdk#1271 ·
-
bug P2 ready for work T-model
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
modelcontextprotocol/rust-sdk#1242 ·
-
P3 question T-documentation T-enhancement
Dificultad 1/5 Menos de una hora Aptitud para principiantes 86/100
modelcontextprotocol/rust-sdk#1155 ·
-
bug P0 ready for work T-security T-transport
modelcontextprotocol/rust-sdk#1272 · 1 asignado ·
-
bug P1 ready for work T-security T-transport
modelcontextprotocol/rust-sdk#1268 · 1 reacción · 1 asignado ·
Todos los issues de modelcontextprotocol/rust-sdk
Issues similares
-
bug github_actions
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
registrystack/registry-stack#1393 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
longbridge/gpui-kit#3223 ·
-
bug engine
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
rocky-data/rocky#2181 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
oasisprotocol/oasis-sdk#2523 ·
-
[indexer] [QA] Add a focused test for the new NonRetryableError / assertSocketAlive() behavior. Abiertobot:ai-assisted component:indexer QA-roadmap status:untriaged
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
midnightntwrk/midnight-indexer#1557 ·