Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.DependencyInjection;
Expand Down Expand Up @@ -39,7 +40,7 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo
var requestAborted = context.RequestAborted;

response.Headers.ContentType = "text/event-stream";
response.Headers.CacheControl = "no-store";
response.Headers.CacheControl = "no-cache,no-store";

var sessionId = MakeNewSessionId();
await using var transport = new SseResponseStreamTransport(response.Body, $"/message?sessionId={sessionId}");
Expand All @@ -50,6 +51,10 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo

try
{
// Make sure we disable all response buffering for SSE
context.Response.Headers.ContentEncoding = "identity";
context.Features.GetRequiredFeature<IHttpResponseBodyFeature>().DisableBuffering();

var transportTask = transport.RunAsync(cancellationToken: requestAborted);
await using var server = McpServerFactory.Create(transport, mcpServerOptions.Value, loggerFactory, endpoints.ServiceProvider);

Expand Down
15 changes: 15 additions & 0 deletions tests/ModelContextProtocol.Tests/SseServerIntegrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,21 @@ public async Task CallTool_Sse_EchoServer_Concurrently()
}
}

[Fact]
public async Task EventSourceResponse_Includes_ExpectedHeaders()
{
using var httpClient = GetHttpClient();
using var sseResponse = await httpClient.GetAsync("", HttpCompletionOption.ResponseHeadersRead, TestContext.Current.CancellationToken);

sseResponse.EnsureSuccessStatusCode();

Assert.Equal("text/event-stream", sseResponse.Content.Headers.ContentType?.MediaType);
Assert.Equal("identity", sseResponse.Content.Headers.ContentEncoding.ToString());
Assert.NotNull(sseResponse.Headers.CacheControl);
Assert.True(sseResponse.Headers.CacheControl.NoStore);
Assert.True(sseResponse.Headers.CacheControl.NoCache);
}

[Fact]
public async Task EventSourceStream_Includes_MessageEventType()
{
Expand Down