diff --git a/04-PracticalSamples/src/src/McpSample.AppHost/McpSample.AppHost.csproj b/04-PracticalSamples/src/src/McpSample.AppHost/McpSample.AppHost.csproj index f1d5566b..3971040c 100644 --- a/04-PracticalSamples/src/src/McpSample.AppHost/McpSample.AppHost.csproj +++ b/04-PracticalSamples/src/src/McpSample.AppHost/McpSample.AppHost.csproj @@ -13,7 +13,8 @@ - + + diff --git a/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpEndpointRouteBuilderExtensions.cs b/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpEndpointRouteBuilderExtensions.cs deleted file mode 100644 index 1f3689ed..00000000 --- a/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpEndpointRouteBuilderExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -using ModelContextProtocol.Protocol.Messages; -using ModelContextProtocol.Server; -using ModelContextProtocol.Utils.Json; -using Microsoft.Extensions.Options; -using ModelContextProtocol.Protocol.Transport; - -public static class McpEndpointRouteBuilderExtensions -{ - public static IEndpointConventionBuilder MapMcpSse(this IEndpointRouteBuilder endpoints) - { - SseResponseStreamTransport? transport = null; - var loggerFactory = endpoints.ServiceProvider.GetRequiredService(); - var mcpServerOptions = endpoints.ServiceProvider.GetRequiredService>(); - - var routeGroup = endpoints.MapGroup(""); - - routeGroup.MapGet("/sse", async (HttpResponse response, CancellationToken requestAborted) => - { - response.Headers.ContentType = "text/event-stream"; - response.Headers.CacheControl = "no-cache"; - - await using var localTransport = transport = new SseResponseStreamTransport(response.Body); - await using var server = McpServerFactory.Create(transport, mcpServerOptions.Value, loggerFactory, endpoints.ServiceProvider); - - try - { - var transportTask = transport.RunAsync(cancellationToken: requestAborted); - await server.StartAsync(cancellationToken: requestAborted); - await transportTask; - } - catch (OperationCanceledException) when (requestAborted.IsCancellationRequested) - { - // RequestAborted always triggers when the client disconnects before a complete response body is written, - // but this is how SSE connections are typically closed. - } - }); - - routeGroup.MapPost("/message", async context => - { - if (transport is null) - { - await Results.BadRequest("Connect to the /sse endpoint before sending messages.").ExecuteAsync(context); - return; - } - - var message = await context.Request.ReadFromJsonAsync(McpJsonUtilities.DefaultOptions, context.RequestAborted); - if (message is null) - { - await Results.BadRequest("No message in request body.").ExecuteAsync(context); - return; - } - - await transport.OnMessageReceivedAsync(message, context.RequestAborted); - context.Response.StatusCode = StatusCodes.Status202Accepted; - await context.Response.WriteAsync("Accepted"); - }); - - return routeGroup; - } -} diff --git a/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpSample.AspNetCoreSseServer.csproj b/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpSample.AspNetCoreSseServer.csproj index 699c448a..34de5b93 100644 --- a/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpSample.AspNetCoreSseServer.csproj +++ b/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/McpSample.AspNetCoreSseServer.csproj @@ -8,7 +8,8 @@ - + + diff --git a/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/Program.cs b/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/Program.cs index 8b9ec1a9..9aa699c7 100644 --- a/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/Program.cs +++ b/04-PracticalSamples/src/src/McpSample.AspNetCoreSseServer/Program.cs @@ -17,6 +17,5 @@ // map endpoints app.MapGet("/", () => $"Hello World! {DateTime.Now}"); -app.MapMcpSse(); app.Run(); diff --git a/04-PracticalSamples/src/src/McpSample.Chat/Components/_Imports.razor b/04-PracticalSamples/src/src/McpSample.Chat/Components/_Imports.razor index 172c3e56..15733a37 100644 --- a/04-PracticalSamples/src/src/McpSample.Chat/Components/_Imports.razor +++ b/04-PracticalSamples/src/src/McpSample.Chat/Components/_Imports.razor @@ -8,3 +8,4 @@ @using Microsoft.JSInterop @using McpSample.BlazorChat @using McpSample.BlazorChat.Components +@using Microsoft.Extensions.AI diff --git a/04-PracticalSamples/src/src/McpSample.Chat/McpSample.BlazorChat.csproj b/04-PracticalSamples/src/src/McpSample.Chat/McpSample.BlazorChat.csproj index 2708c84d..b493e1a5 100644 --- a/04-PracticalSamples/src/src/McpSample.Chat/McpSample.BlazorChat.csproj +++ b/04-PracticalSamples/src/src/McpSample.Chat/McpSample.BlazorChat.csproj @@ -9,12 +9,13 @@ - - + + + - - + + diff --git a/04-PracticalSamples/src/src/McpSample.Chat/Program.cs b/04-PracticalSamples/src/src/McpSample.Chat/Program.cs index 2be9701e..3de00290 100644 --- a/04-PracticalSamples/src/src/McpSample.Chat/Program.cs +++ b/04-PracticalSamples/src/src/McpSample.Chat/Program.cs @@ -1,8 +1,7 @@ +using McpSample.BlazorChat; using McpSample.BlazorChat.Components; using Microsoft.Extensions.AI; using ModelContextProtocol.Client; -using ModelContextProtocol.Configuration; -using ModelContextProtocol.Protocol.Transport; var builder = WebApplication.CreateBuilder(args); @@ -28,23 +27,15 @@ // add MCP client builder.Services.AddSingleton(sp => { - McpClientOptions mcpClientOptions = new() - { ClientInfo = new() { Name = "AspNetCoreSseClient", Version = "1.0.0" } }; - - HttpClient httpClient = new() - { - BaseAddress = new("https://localhost:7133/sse") //"https +http://aspnetsseserver" + "/sse") - }; - - McpServerConfig mcpServerConfig = new() - { - Id = "AspNetCoreSse", - Name = "AspNetCoreSse", - TransportType = TransportTypes.Sse, - Location = httpClient.BaseAddress.ToString(), - }; - - var mcpClient = McpClientFactory.CreateAsync(mcpServerConfig, mcpClientOptions).GetAwaiter().GetResult(); + var clientTransport = new SseClientTransport( + new() + { + Name = "AspNetCoreSse Server", + Endpoint = new Uri("https://localhost:7133"), // Remove /sse endpoint since it's deprecated + TransportMode = HttpTransportMode.StreamableHttp // Use new Streamable HTTP transport + }); + + var mcpClient = McpClientFactory.CreateAsync(clientTransport).GetAwaiter().GetResult(); return mcpClient; }); diff --git a/04-PracticalSamples/src/src/McpSample.ServiceDefaults/McpSample.ServiceDefaults.csproj b/04-PracticalSamples/src/src/McpSample.ServiceDefaults/McpSample.ServiceDefaults.csproj index 64eaec02..da455046 100644 --- a/04-PracticalSamples/src/src/McpSample.ServiceDefaults/McpSample.ServiceDefaults.csproj +++ b/04-PracticalSamples/src/src/McpSample.ServiceDefaults/McpSample.ServiceDefaults.csproj @@ -7,12 +7,13 @@ - - - - - - - + + + + + + + + \ No newline at end of file