Skip to content

Commit dffa90e

Browse files
authored
Merge branch 'main' into samples-aot
2 parents 8d6b064 + c452dc8 commit dffa90e

File tree

63 files changed

+1559
-607
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1559
-607
lines changed

Directory.Packages.props

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,63 @@
11
<Project>
22
<PropertyGroup>
33
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
4-
<SystemVersion>9.0.3</SystemVersion>
54
<System10Version>10.0.0-preview.2.25163.2</System10Version>
6-
<MicrosoftExtensionsVersion>9.0.3</MicrosoftExtensionsVersion>
75
<MicrosoftExtensionsAIVersion>9.3.0-preview.1.25161.3</MicrosoftExtensionsAIVersion>
86
</PropertyGroup>
7+
8+
<!-- Product dependencies netstandard -->
9+
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
10+
<PackageVersion Include="Microsoft.Bcl.Memory" Version="9.0.0" />
11+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
12+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
13+
<PackageVersion Include="System.IO.Pipelines" Version="8.0.0" />
14+
<PackageVersion Include="System.Text.Json" Version="8.0.5" />
15+
<PackageVersion Include="System.Threading.Channels" Version="8.0.0" />
16+
</ItemGroup>
17+
18+
<!-- Product dependencies LTS -->
19+
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
20+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
21+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
22+
<PackageVersion Include="System.IO.Pipelines" Version="8.0.0" />
23+
</ItemGroup>
24+
25+
<!-- Product dependencies .NET 9 -->
26+
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
27+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.0" />
28+
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.0" />
29+
<PackageVersion Include="System.IO.Pipelines" Version="9.0.0" />
30+
</ItemGroup>
31+
32+
<!-- Product dependencies shared -->
933
<ItemGroup>
10-
<!-- Product dependencies -->
11-
<PackageVersion Include="coverlet.collector" Version="6.0.4">
12-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
13-
<PrivateAssets>all</PrivateAssets>
14-
</PackageVersion>
15-
<PackageVersion Include="Microsoft.Bcl.Memory" Version="$(SystemVersion)" />
16-
<PackageVersion Include="Microsoft.Extensions.AI" Version="$(MicrosoftExtensionsAIVersion)" />
1734
<PackageVersion Include="Microsoft.Extensions.AI.Abstractions" Version="$(MicrosoftExtensionsAIVersion)" />
18-
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftExtensionsVersion)" />
19-
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsVersion)" />
35+
<PackageVersion Include="Microsoft.Extensions.AI" Version="$(MicrosoftExtensionsAIVersion)" />
2036
<PackageVersion Include="System.Net.ServerSentEvents" Version="$(System10Version)" />
21-
<PackageVersion Include="System.Text.Json" Version="$(SystemVersion)" />
22-
<PackageVersion Include="System.Threading.Channels" Version="$(SystemVersion)" />
37+
</ItemGroup>
38+
39+
<ItemGroup>
2340

2441
<!-- Build Infra & Packaging -->
2542
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
2643

2744
<!-- Testing dependencies -->
2845
<PackageVersion Include="Anthropic.SDK" Version="5.0.0" />
46+
<PackageVersion Include="coverlet.collector" Version="6.0.4">
47+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
48+
<PrivateAssets>all</PrivateAssets>
49+
</PackageVersion>
2950
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1" />
3051
<PackageVersion Include="Microsoft.Extensions.AI.OpenAI" Version="$(MicrosoftExtensionsAIVersion)" />
31-
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsVersion)" />
32-
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsVersion)" />
33-
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsVersion)" />
52+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.3" />
53+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.3" />
54+
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.3" />
55+
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="9.0.3" />
56+
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.3" />
3457
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
3558
<PackageVersion Include="Moq" Version="4.20.72" />
59+
<PackageVersion Include="OpenTelemetry" Version="1.11.2" />
60+
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.11.2" />
3661
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
3762
<PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.0" />
3863
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />

samples/QuickstartClient/QuickstartClient.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<ItemGroup>
2020
<PackageReference Include="Anthropic.SDK" />
2121
<PackageReference Include="Microsoft.Extensions.Hosting" />
22+
<PackageReference Include="Microsoft.Extensions.AI" />
2223
</ItemGroup>
2324

2425
</Project>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Runtime.CompilerServices;
2+
3+
namespace System.Threading.Channels;
4+
5+
internal static class ChannelExtensions
6+
{
7+
public static async IAsyncEnumerable<T> ReadAllAsync<T>(this ChannelReader<T> reader, [EnumeratorCancellation] CancellationToken cancellationToken)
8+
{
9+
while (await reader.WaitToReadAsync(cancellationToken).ConfigureAwait(false))
10+
{
11+
while (reader.TryRead(out var item))
12+
{
13+
yield return item;
14+
}
15+
}
16+
}
17+
}

src/ModelContextProtocol.AspNetCore/McpEndpointRouteBuilderExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo
4747
{
4848
throw new Exception($"Unreachable given good entropy! Session with ID '{sessionId}' has already been created.");
4949
}
50-
await using var server = McpServerFactory.Create(transport, mcpServerOptions.Value, loggerFactory, endpoints.ServiceProvider);
5150

5251
try
5352
{
5453
var transportTask = transport.RunAsync(cancellationToken: requestAborted);
54+
await using var server = McpServerFactory.Create(transport, mcpServerOptions.Value, loggerFactory, endpoints.ServiceProvider);
5555

5656
try
5757
{
@@ -85,7 +85,7 @@ public static IEndpointConventionBuilder MapMcp(this IEndpointRouteBuilder endpo
8585

8686
if (!_sessions.TryGetValue(sessionId.ToString(), out var transport))
8787
{
88-
await Results.BadRequest($"Session {sessionId} not found.").ExecuteAsync(context);
88+
await Results.BadRequest($"Session ID not found.").ExecuteAsync(context);
8989
return;
9090
}
9191

src/ModelContextProtocol.AspNetCore/ModelContextProtocol.AspNetCore.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFrameworks>net9.0;net8.0</TargetFrameworks>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>

src/ModelContextProtocol/Client/McpClient.cs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace ModelContextProtocol.Client;
1111

1212
/// <inheritdoc/>
13-
internal sealed class McpClient : McpJsonRpcEndpoint, IMcpClient
13+
internal sealed class McpClient : McpEndpoint, IMcpClient
1414
{
1515
private readonly IClientTransport _clientTransport;
1616
private readonly McpClientOptions _options;
@@ -40,12 +40,14 @@ public McpClient(IClientTransport clientTransport, McpClientOptions options, Mcp
4040
throw new InvalidOperationException($"Sampling capability was set but it did not provide a handler.");
4141
}
4242

43-
SetRequestHandler<CreateMessageRequestParams, CreateMessageResult>(
43+
SetRequestHandler(
4444
RequestMethods.SamplingCreateMessage,
4545
(request, cancellationToken) => samplingHandler(
4646
request,
4747
request?.Meta?.ProgressToken is { } token ? new TokenProgress(this, token) : NullProgress.Instance,
48-
cancellationToken));
48+
cancellationToken),
49+
McpJsonUtilities.JsonContext.Default.CreateMessageRequestParams,
50+
McpJsonUtilities.JsonContext.Default.CreateMessageResult);
4951
}
5052

5153
if (options.Capabilities?.Roots is { } rootsCapability)
@@ -55,9 +57,11 @@ public McpClient(IClientTransport clientTransport, McpClientOptions options, Mcp
5557
throw new InvalidOperationException($"Roots capability was set but it did not provide a handler.");
5658
}
5759

58-
SetRequestHandler<ListRootsRequestParams, ListRootsResult>(
60+
SetRequestHandler(
5961
RequestMethods.RootsList,
60-
(request, cancellationToken) => rootsHandler(request, cancellationToken));
62+
rootsHandler,
63+
McpJsonUtilities.JsonContext.Default.ListRootsRequestParams,
64+
McpJsonUtilities.JsonContext.Default.ListRootsResult);
6165
}
6266
}
6367

@@ -82,9 +86,7 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)
8286
{
8387
// Connect transport
8488
_sessionTransport = await _clientTransport.ConnectAsync(cancellationToken).ConfigureAwait(false);
85-
// We don't want the ConnectAsync token to cancel the session after we've successfully connected.
86-
// The base class handles cleaning up the session in DisposeAsync without our help.
87-
StartSession(_sessionTransport, fullSessionCancellationToken: CancellationToken.None);
89+
StartSession(_sessionTransport);
8890

8991
// Perform initialization sequence
9092
using var initializationCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
@@ -93,18 +95,17 @@ public async Task ConnectAsync(CancellationToken cancellationToken = default)
9395
try
9496
{
9597
// Send initialize request
96-
var initializeResponse = await SendRequestAsync<InitializeResult>(
97-
new JsonRpcRequest
98+
var initializeResponse = await this.SendRequestAsync(
99+
RequestMethods.Initialize,
100+
new InitializeRequestParams
98101
{
99-
Method = RequestMethods.Initialize,
100-
Params = new InitializeRequestParams()
101-
{
102-
ProtocolVersion = _options.ProtocolVersion,
103-
Capabilities = _options.Capabilities ?? new ClientCapabilities(),
104-
ClientInfo = _options.ClientInfo
105-
}
102+
ProtocolVersion = _options.ProtocolVersion,
103+
Capabilities = _options.Capabilities ?? new ClientCapabilities(),
104+
ClientInfo = _options.ClientInfo
106105
},
107-
initializationCts.Token).ConfigureAwait(false);
106+
McpJsonUtilities.JsonContext.Default.InitializeRequestParams,
107+
McpJsonUtilities.JsonContext.Default.InitializeResult,
108+
cancellationToken: initializationCts.Token).ConfigureAwait(false);
108109

109110
// Store server information
110111
_logger.ServerCapabilitiesReceived(EndpointName,

0 commit comments

Comments
 (0)