Skip to content

Automatically fall back from Streamable HTTP to SSE on the client by default #456

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
May 28, 2025

Conversation

halter73
Copy link
Contributor

  • Adds automatic transport detection to the client that tries Streamable HTTP first and falls back to SSE if that fails and makes it the default
  • This is a breaking change. It removes the newly added SseClientTransportOptions.UseStreamableHttp. I expect even more breaking changes soon related to Convert IMcpEndpoint, IMcpClient, and IMcpServer types to classes. #355
  • This matches VS Code's behavior for maximum compatibility when sharing mcp.json files.

I used copilot for the initial stages of this PR on Friday, but then took it over myself to avoid the awkward Channel forwarding by making it a constructor parameter and removing a bunch of extraneous code. I might have been able to coach Copilot to do this as well, but at that point it felt easier to just do it. It was really helpful for stuff like writing tests and brainstorming option names.

Fixes #440 @AArnott

…default

- Adds automatic transport detection to the client that tries Streamable HTTP
  first and falls back to SSE if that fails and makes it the default
- This matches VS Code's behavior for maximum compatibility when sharing mcp.json files.
halter73 added 4 commits May 28, 2025 09:21
…g messages

- This might fix the WithProgress_ProgressReported failures

  Failed ModelContextProtocol.Tests.Client.McpClientExtensionsTests.WithProgress_ProgressReported [22 ms]
  Error Message:
   System.IO.IOException : Transport is already disconnected and can't be reconnected.
  Stack Trace:
     at ModelContextProtocol.Protocol.TransportBase.SetConnected() in /_/src/ModelContextProtocol/Protocol/TransportBase.cs:line 125
   at ModelContextProtocol.Client.StreamClientSessionTransport..ctor(TextWriter serverInput, TextReader serverOutput, String endpointName, ILoggerFactory loggerFactory) in /_/src/ModelContextProtocol/Client/StreamClientSessionTransport.cs:line 54
   at ModelContextProtocol.Protocol.StreamClientTransport.ConnectAsync(CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/StreamClientTransport.cs:line 49
   at ModelContextProtocol.Client.McpClient.ConnectAsync(CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/McpClient.cs:line 105
   at ModelContextProtocol.Client.McpClient.ConnectAsync(CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/McpClient.cs:line 164
   at ModelContextProtocol.Client.McpClientFactory.CreateAsync(IClientTransport clientTransport, McpClientOptions clientOptions, ILoggerFactory loggerFactory, CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/McpClientFactory.cs:line 37
   at ModelContextProtocol.Client.McpClientFactory.CreateAsync(IClientTransport clientTransport, McpClientOptions clientOptions, ILoggerFactory loggerFactory, CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/McpClientFactory.cs:line 46
   at ModelContextProtocol.Tests.ClientServerTestBase.CreateMcpClientForServer() in /_/tests/ModelContextProtocol.Tests/ClientServerTestBase.cs:line 67
   at ModelContextProtocol.Tests.Client.McpClientExtensionsTests.WithProgress_ProgressReported() in /_/tests/ModelContextProtocol.Tests/Client/McpClientExtensionsTests.cs:line 356
--- End of stack trace from previous location ---
  Standard Output Messages:
 | [2025-05-28T16:24:33] ModelContextProtocol.Client.StreamClientSessionTransport Information: Client (stream) transport reading messages.
 | [2025-05-28T16:24:33] ModelContextProtocol.Client.StreamClientSessionTransport Warning: Client (stream) transport message reading failed.
 System.InvalidOperationException: Transport is not connected.
    at ModelContextProtocol.Protocol.TransportBase.WriteMessageAsync(JsonRpcMessage message, CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Protocol/TransportBase.cs:line 91
    at ModelContextProtocol.Client.StreamClientSessionTransport.ProcessMessageAsync(String line, CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/StreamClientSessionTransport.cs:line 134
    at ModelContextProtocol.Client.StreamClientSessionTransport.ReadMessagesAsync(CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/StreamClientSessionTransport.cs:line 108
 | [2025-05-28T16:24:33] ModelContextProtocol.Client.StreamClientSessionTransport Information: Client (stream) shutting down.
 | [2025-05-28T16:24:33] ModelContextProtocol.Client.StreamClientSessionTransport Information: Client (stream) shut down.
 | [2025-05-28T16:24:33] ModelContextProtocol.Client.McpClient Error: in-memory-stream client initialization error.
 System.IO.IOException: Transport is already disconnected and can't be reconnected.
    at ModelContextProtocol.Protocol.TransportBase.SetConnected() in /_/src/ModelContextProtocol/Protocol/TransportBase.cs:line 125
    at ModelContextProtocol.Client.StreamClientSessionTransport..ctor(TextWriter serverInput, TextReader serverOutput, String endpointName, ILoggerFactory loggerFactory) in /_/src/ModelContextProtocol/Client/StreamClientSessionTransport.cs:line 54
    at ModelContextProtocol.Protocol.StreamClientTransport.ConnectAsync(CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/StreamClientTransport.cs:line 49
    at ModelContextProtocol.Client.McpClient.ConnectAsync(CancellationToken cancellationToken) in /_/src/ModelContextProtocol/Client/McpClient.cs:line 105

- https://github.com/modelcontextprotocol/csharp-sdk/actions/runs/15305366319/job/43056566292?pr=456
@halter73 halter73 merged commit 317f468 into modelcontextprotocol:main May 28, 2025
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Implicit SSE vs. Streamable HTTP support
3 participants