conductor-oss/conductor · error · RuntimeException
No data found in SSE response: {sseBody}
Error message
No data found in SSE response: {sseBody} What it means
Thrown by parseSseResponse when an SSE response body contains zero usable `data:` lines. It iterates lines, keeps data: payloads, skips empty and [DONE] markers, and if nothing remained it cannot produce JSON. Means the server sent an SSE stream with only comments, event: lines, ping/keep-alive, or was empty.
Source
Thrown at ai/src/main/java/org/conductoross/conductor/ai/mcp/MCPService.java:365
log.debug("Parsing SSE response: {}", sseBody);
// Find all "data:" lines and concatenate their content
StringBuilder jsonData = new StringBuilder();
String[] lines = sseBody.split("\n");
for (String line : lines) {
String trimmed = line.trim();
if (trimmed.startsWith("data:")) {
String data = trimmed.substring(5).trim();
// Skip empty data or "[DONE]" markers
if (!data.isEmpty() && !data.equals("[DONE]")) {
jsonData.append(data);
}
}
}
if (jsonData.length() == 0) {
throw new RuntimeException("No data found in SSE response: " + sseBody);
}
try {
return objectMapper.readTree(jsonData.toString());
} catch (Exception e) {
throw new RuntimeException("Failed to parse SSE data as JSON: " + jsonData, e);
}
}
/** Executes one MCP request and follows redirects while protecting sensitive headers. */
private ResponsePayload execute(Request initialRequest) throws Exception {
Request request = initialRequest;
for (int redirects = 0; redirects <= 5; redirects++) {
try (Response response = httpClient.newCall(request).execute()) {
if (!response.isRedirect()) {
return new ResponsePayload(
response.code(),
response.header("Content-Type", "application/json"),View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Log the raw SSE body (it is in the exception message) to see what frames were actually sent.
- Confirm the server emits `data:` lines for JSON-RPC responses per the MCP SSE transport spec.
- If the server uses a different event field, use a compliant server or a custom SSE parser.
- Check the connection wasn't closed/truncated before the result event arrived.
Defensive patterns
Strategy: try-catch
Try / catch
try {
mcpService.listTools(serverUrl, headers);
} catch (RuntimeException e) {
if (e.getMessage().contains("No data found in SSE response")) {
// server sent an SSE stream with no data: lines; check transport compatibility
}
throw e;
} Prevention
- Confirm the server emits `data:` lines per the MCP SSE transport.
- Log the raw SSE body (present in the message) to see what frames were sent.
- Prefer the streamable-HTTP JSON endpoint over SSE when available.
When it happens
Trigger: Server's content-type was text/event-stream but the body was an empty stream, only `event:` headers, only `: comment` lines, or only `[DONE]` markers; the actual JSON-RPC result event was never delivered (server closed the stream early).
Common situations: Long-lived SSE endpoint where the response event hadn't arrived yet but the connection closed; server uses a non-standard field instead of `data:`; interceptor stripped data lines; the response was a heartbeat-only stream.
Related errors
- Failed to parse SSE data as JSON: {jsonData}
- Invalid JSON-RPC response: missing 'result' field
- Invalid response: 'tools' field is missing or not an array
- No data found in SSE response: {sseBody}
- HTTP %d error from MCP server: %s
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/3a9de34bb83b77aa.
Report an issue: GitHub.