Skip to content

Commit 4793ebf

Browse files
committed
Set StreamClientSessionTransport to the connected state before reading 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
1 parent 67caeda commit 4793ebf

1 file changed

Lines changed: 5 additions & 5 deletions

File tree

src/ModelContextProtocol/Client/StreamClientSessionTransport.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ internal class StreamClientSessionTransport : TransportBase
1717
/// Initializes a new instance of the <see cref="StreamClientSessionTransport"/> class.
1818
/// </summary>
1919
/// <param name="serverInput">
20-
/// The text writer connected to the server's input stream.
20+
/// The text writer connected to the server's input stream.
2121
/// Messages written to this writer will be sent to the server.
2222
/// </param>
2323
/// <param name="serverOutput">
@@ -41,17 +41,17 @@ public StreamClientSessionTransport(
4141
_serverOutput = serverOutput;
4242
_serverInput = serverInput;
4343

44+
SetConnected();
45+
4446
// Start reading messages in the background. We use the rarer pattern of new Task + Start
4547
// in order to ensure that the body of the task will always see _readTask initialized.
4648
// It is then able to reliably null it out on completion.
4749
var readTask = new Task<Task>(
48-
thisRef => ((StreamClientSessionTransport)thisRef!).ReadMessagesAsync(_shutdownCts.Token),
50+
thisRef => ((StreamClientSessionTransport)thisRef!).ReadMessagesAsync(_shutdownCts.Token),
4951
this,
5052
TaskCreationOptions.DenyChildAttach);
5153
_readTask = readTask.Unwrap();
5254
readTask.Start();
53-
54-
SetConnected();
5555
}
5656

5757
/// <inheritdoc/>
@@ -80,7 +80,7 @@ public override async Task SendMessageAsync(JsonRpcMessage message, Cancellation
8080
}
8181

8282
/// <inheritdoc/>
83-
public override ValueTask DisposeAsync() =>
83+
public override ValueTask DisposeAsync() =>
8484
CleanupAsync(cancellationToken: CancellationToken.None);
8585

8686
private async Task ReadMessagesAsync(CancellationToken cancellationToken)

0 commit comments

Comments
 (0)