Kuberwastaken/claurst · error · anyhow::Error

MCP server ' ': no supported streamable HTTP protocol…

Error message

MCP server '{}': no supported streamable HTTP protocol version found

What it means

During streamable-HTTP connect the client tries each supported protocol version in turn and remembers the last failure. If the version list produced no error to report (conceptually, the attempts were exhausted without a recorded error), it throws this fallback error naming the server.

Solutions

  1. Check the per-attempt errors logged just before this message to find the real failure cause
  2. Ensure the MCP server supports at least one streamable-HTTP protocol version the client offers
  3. Verify STREAMABLE_HTTP_PROTOCOL_VERSIONS is non-empty and unpolluted in the installed build
  4. Fall back to server_type "sse" if the server only supports legacy transport
Defensive patterns

Strategy: fallback

Try / catch

match connect(streamable_cfg).await {
    Err(e) if e.to_string().contains("no supported streamable HTTP protocol version") => {
        connect(sse_cfg).await? // fall back to legacy SSE
    }
    r => r?,
}

Prevention

When it happens

Trigger: MCP connect with server_type "streamable-http" where every protocol-version attempt failed and last_error was None — i.e. an empty/fully-filtered STREAMABLE_HTTP_PROTOCOL_VERSIONS list or a loop that never recorded an error.

Common situations: All protocol versions rejected (server incompatible) combined with code paths that swallow the per-attempt error; misconfigured feature flags emptying the version list; library build where the versions slice is empty.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


AI-assisted analysis of Kuberwastaken/claurst@b0637c97ec (2026-09-10). Data as JSON: /api/errors/5de157162848f645. Report an issue: GitHub.

Appendix: source

Thrown at src-rust/crates/mcp/src/lib.rs:642

                            Ok(backend) => return Ok(Self::from_backend(Arc::new(backend))),
                            Err(e) => {
                                let message = e.to_string();
                                if Self::is_unsupported_protocol_error(&message) {
                                    debug!(
                                        server = %config.name,
                                        protocol_version = %protocol_version_label,
                                        error = %message,
                                        "Streamable HTTP protocol version unsupported; trying fallback"
                                    );
                                    last_error = Some(e);
                                    continue;
                                }
                                return Err(e);
                            }
                        }
                    }
                    Err(last_error.unwrap_or_else(|| {
                        anyhow::anyhow!(
                            "MCP server '{}': no supported streamable HTTP protocol version found",
                            config.name
                        )
                    }))
                }
                other => Err(anyhow::anyhow!(
                    "MCP server '{}': unsupported transport type '{}'",
                    config.name,
                    other
                )),
            }
        }

        pub(crate) fn is_unsupported_protocol_error(message: &str) -> bool {
            // rmcp, servers, and gateways do not emit a single stable
            // protocol-negotiation error string, so match the known variants
            // conservatively to keep downgrade fallback working.
            let lower = message.to_ascii_lowercase();

View on GitHub (pinned to b0637c97ec)