From a587c24a6d0f41daae691f38043823ac0bbdba6f Mon Sep 17 00:00:00 2001 From: Xijun Dai Date: Fri, 14 Nov 2025 16:37:33 +0800 Subject: [PATCH] feat(streamable-http): support both SSE and JSON response formats What this enables: - Clients can accept either Server-Sent Events (SSE) or JSON responses - Flexible content negotiation based on server preferences - Improved interoperability with different MCP server implementations --- .../src/transport/common/reqwest/streamable_http_client.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/rmcp/src/transport/common/reqwest/streamable_http_client.rs b/crates/rmcp/src/transport/common/reqwest/streamable_http_client.rs index 6026e056..cd1942d5 100644 --- a/crates/rmcp/src/transport/common/reqwest/streamable_http_client.rs +++ b/crates/rmcp/src/transport/common/reqwest/streamable_http_client.rs @@ -33,7 +33,7 @@ impl StreamableHttpClient for reqwest::Client { ) -> Result>, StreamableHttpError> { let mut request_builder = self .get(uri.as_ref()) - .header(ACCEPT, EVENT_STREAM_MIME_TYPE) + .header(ACCEPT, [EVENT_STREAM_MIME_TYPE, JSON_MIME_TYPE].join(", ")) .header(HEADER_SESSION_ID, session_id.as_ref()); if let Some(last_event_id) = last_event_id { request_builder = request_builder.header(HEADER_LAST_EVENT_ID, last_event_id); @@ -48,7 +48,9 @@ impl StreamableHttpClient for reqwest::Client { let response = response.error_for_status()?; match response.headers().get(reqwest::header::CONTENT_TYPE) { Some(ct) => { - if !ct.as_bytes().starts_with(EVENT_STREAM_MIME_TYPE.as_bytes()) { + if !ct.as_bytes().starts_with(EVENT_STREAM_MIME_TYPE.as_bytes()) + && !ct.as_bytes().starts_with(JSON_MIME_TYPE.as_bytes()) + { return Err(StreamableHttpError::UnexpectedContentType(Some( String::from_utf8_lossy(ct.as_bytes()).to_string(), )));