Skip to content

Commit ccfd685

Browse files
committed
Avoid StdioServerTransport where not required
StdioServerTransport does not reliably close on linux, which causes a threadpool thread to be blocked on read. This can lead to threadpool starvation and application hangs. Since the tests in question do not require stdio transport, switch to using StreamServerTransport with null streams to avoid this issue.
1 parent fa6e7b3 commit ccfd685

4 files changed

Lines changed: 14 additions & 13 deletions

File tree

tests/ModelContextProtocol.Tests/Configuration/McpServerOptionsSetupTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,10 @@ public async Task ServerCapabilities_WithManualResourceSubscribeCapability_AndWi
181181
};
182182
})
183183
.WithResources<SimpleResourceType>()
184-
.WithStdioServerTransport();
184+
.WithStreamServerTransport(Stream.Null, Stream.Null);
185185

186-
var options = services.BuildServiceProvider().GetRequiredService<IOptions<McpServerOptions>>().Value;
186+
await using var sp = services.BuildServiceProvider();
187+
var options = sp.GetRequiredService<IOptions<McpServerOptions>>().Value;
187188

188189
// The options should preserve the user's manually set capabilities
189190
Assert.NotNull(options.Capabilities?.Resources);

tests/ModelContextProtocol.Tests/Configuration/McpServerResourceCapabilityIntegrationTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ public async Task Resources_AreExposed_WhenSubscribeCapabilitySetInAddMcpServerO
106106
};
107107
})
108108
.WithResources<LiveResources>()
109-
.WithStdioServerTransport();
109+
.WithStreamServerTransport(Stream.Null, Stream.Null);
110110

111-
var serviceProvider = services.BuildServiceProvider();
111+
await using var serviceProvider = services.BuildServiceProvider();
112112
var mcpOptions = serviceProvider.GetRequiredService<IOptions<McpServerOptions>>().Value;
113113

114114
// Verify capabilities are preserved
@@ -122,15 +122,15 @@ public async Task Resources_AreExposed_WhenSubscribeCapabilitySetInAddMcpServerO
122122
}
123123

124124
[Fact]
125-
public void ResourcesCapability_IsCreated_WhenOnlyResourcesAreProvided()
125+
public async Task ResourcesCapability_IsCreated_WhenOnlyResourcesAreProvided()
126126
{
127127
// Test that ResourcesCapability is created even without handlers or manual setting
128128
var services = new ServiceCollection();
129129
var builder = services.AddMcpServer()
130130
.WithResources<LiveResources>()
131-
.WithStdioServerTransport();
131+
.WithStreamServerTransport(Stream.Null, Stream.Null);
132132

133-
var serviceProvider = services.BuildServiceProvider();
133+
await using var serviceProvider = services.BuildServiceProvider();
134134
var mcpOptions = serviceProvider.GetRequiredService<IOptions<McpServerOptions>>().Value;
135135

136136
// Resources are registered

tests/ModelContextProtocol.Tests/Server/McpServerLoggingLevelTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public async Task CanCreateServerWithLoggingLevelHandler()
2020
var services = new ServiceCollection();
2121

2222
services.AddMcpServer()
23-
.WithStdioServerTransport()
23+
.WithStreamServerTransport(Stream.Null, Stream.Null)
2424
.WithSetLoggingLevelHandler(async (ctx, ct) => new EmptyResult());
2525

2626
await using var provider = services.BuildServiceProvider();
@@ -34,7 +34,7 @@ public async Task AddingLoggingLevelHandlerSetsLoggingCapability()
3434
var services = new ServiceCollection();
3535

3636
services.AddMcpServer()
37-
.WithStdioServerTransport()
37+
.WithStreamServerTransport(Stream.Null, Stream.Null)
3838
.WithSetLoggingLevelHandler(async (ctx, ct) => new EmptyResult());
3939

4040
await using var provider = services.BuildServiceProvider();
@@ -50,7 +50,7 @@ public async Task ServerWithoutCallingLoggingLevelHandlerDoesNotSetLoggingCapabi
5050
{
5151
var services = new ServiceCollection();
5252
services.AddMcpServer()
53-
.WithStdioServerTransport();
53+
.WithStreamServerTransport(Stream.Null, Stream.Null);
5454
await using var provider = services.BuildServiceProvider();
5555
var server = provider.GetRequiredService<McpServer>();
5656
Assert.Null(server.ServerOptions.Capabilities?.Logging);

tests/ModelContextProtocol.Tests/Server/McpServerResourceTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public async Task CanCreateServerWithResource()
3434
var services = new ServiceCollection();
3535

3636
services.AddMcpServer()
37-
.WithStdioServerTransport()
37+
.WithStreamServerTransport(Stream.Null, Stream.Null)
3838
.WithListResourcesHandler(async (ctx, ct) =>
3939
{
4040
return new ListResourcesResult
@@ -70,7 +70,7 @@ public async Task CanCreateServerWithResourceTemplates()
7070
var services = new ServiceCollection();
7171

7272
services.AddMcpServer()
73-
.WithStdioServerTransport()
73+
.WithStreamServerTransport(Stream.Null, Stream.Null)
7474
.WithListResourceTemplatesHandler(async (ctx, ct) =>
7575
{
7676
return new ListResourceTemplatesResult
@@ -104,7 +104,7 @@ public async Task CreatingReadHandlerWithNoListHandlerSucceeds()
104104
{
105105
var services = new ServiceCollection();
106106
services.AddMcpServer()
107-
.WithStdioServerTransport()
107+
.WithStreamServerTransport(Stream.Null, Stream.Null)
108108
.WithReadResourceHandler(async (ctx, ct) =>
109109
{
110110
return new ReadResourceResult

0 commit comments

Comments
 (0)