Updating to align with quickstart sample (#221)
This commit is contained in:
parent
0e679f9697
commit
27c1519f01
2 changed files with 36 additions and 54 deletions
|
|
@ -1384,7 +1384,7 @@ cd QuickstartClient
|
|||
|
||||
Then, add the required dependencies to your project:
|
||||
```bash
|
||||
dotnet add package ModelContextProtocol --preview
|
||||
dotnet add package ModelContextProtocol --prerelease
|
||||
dotnet add package Anthropic.SDK
|
||||
dotnet add package Microsoft.Extensions.Hosting
|
||||
```
|
||||
|
|
@ -1423,10 +1423,10 @@ var (command, arguments) = args switch
|
|||
_ => throw new NotSupportedException("An unsupported server script was provided. Supported scripts are .py, .js, or .csproj")
|
||||
};
|
||||
|
||||
var mcpClient = await McpClientFactory.CreateAsync(new()
|
||||
await using var mcpClient = await McpClientFactory.CreateAsync(new()
|
||||
{
|
||||
Id = "demo-client",
|
||||
Name = "Demo Client",
|
||||
Id = "demo-server",
|
||||
Name = "Demo Server",
|
||||
TransportType = TransportTypes.StdIo,
|
||||
TransportOptions = new()
|
||||
{
|
||||
|
|
@ -1455,7 +1455,7 @@ This configures a MCP client that will connect to a server that is provided as a
|
|||
Now let's add the core functionality for processing queries and handling tool calls:
|
||||
|
||||
```csharp
|
||||
IChatClient anthropicClient = new AnthropicClient(new APIAuthentication(builder.Configuration["ANTHROPIC_API_KEY"]))
|
||||
using IChatClient anthropicClient = new AnthropicClient(new APIAuthentication(builder.Configuration["ANTHROPIC_API_KEY"]))
|
||||
.Messages
|
||||
.AsBuilder()
|
||||
.UseFunctionInvocation()
|
||||
|
|
@ -1465,7 +1465,7 @@ var options = new ChatOptions
|
|||
{
|
||||
MaxOutputTokens = 1000,
|
||||
ModelId = "claude-3-5-sonnet-20241022",
|
||||
Tools = [.. tools.Cast<AITool>()]
|
||||
Tools = [.. tools]
|
||||
};
|
||||
|
||||
while (true)
|
||||
|
|
@ -1484,16 +1484,14 @@ while (true)
|
|||
break;
|
||||
}
|
||||
|
||||
var response = await anthropicClient.GetResponseAsync(query, options);
|
||||
var response = anthropicClient.GetStreamingResponseAsync(query, options);
|
||||
|
||||
foreach (var message in response.Messages)
|
||||
await foreach (var message in response)
|
||||
{
|
||||
Console.WriteLine(message.Text);
|
||||
Console.Write(message.Text);
|
||||
}
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
anthropicClient.Dispose();
|
||||
await mcpClient.DisposeAsync();
|
||||
```
|
||||
|
||||
## Key Components Explained
|
||||
|
|
|
|||
|
|
@ -1450,7 +1450,7 @@ After creating the project, add NuGet package for the Model Context Protocol SDK
|
|||
|
||||
```bash
|
||||
# Add the Model Context Protocol SDK NuGet package
|
||||
dotnet add package ModelContextProtocol --preview
|
||||
dotnet add package ModelContextProtocol --prerelease
|
||||
# Add the .NET Hosting NuGet package
|
||||
dotnet add package Microsoft.Extensions.Hosting
|
||||
```
|
||||
|
|
@ -1461,14 +1461,24 @@ Now let’s dive into building your server.
|
|||
Open the `Program.cs` file in your project and replace its contents with the following code:
|
||||
|
||||
```csharp
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using ModelContextProtocol;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
var builder = Host.CreateEmptyApplicationBuilder(settings: null);
|
||||
|
||||
builder.Services.AddMcpServer()
|
||||
.WithStdioServerTransport()
|
||||
.WithToolsFromAssembly();
|
||||
|
||||
builder.Services.AddSingleton(_ =>
|
||||
{
|
||||
var client = new HttpClient() { BaseAddress = new Uri("https://api.weather.gov") };
|
||||
client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("weather-tool", "1.0"));
|
||||
return client;
|
||||
});
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
await app.RunAsync();
|
||||
|
|
@ -1485,7 +1495,7 @@ Next, define a class with the tool execution handlers for querying and convertin
|
|||
```csharp
|
||||
using ModelContextProtocol.Server;
|
||||
using System.ComponentModel;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace QuickstartWeatherServer.Tools;
|
||||
|
|
@ -1495,14 +1505,10 @@ public static class WeatherTools
|
|||
{
|
||||
[McpServerTool, Description("Get weather alerts for a US state.")]
|
||||
public static async Task<string> GetAlerts(
|
||||
HttpClient client,
|
||||
[Description("The US state to get alerts for.")] string state)
|
||||
{
|
||||
using HttpClient client = GetWeatherClient();
|
||||
|
||||
var response = await client.GetAsync($"/alerts/active/area/{state}");
|
||||
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
|
||||
var jsonElement = await client.GetFromJsonAsync<JsonElement>($"/alerts/active/area/{state}");
|
||||
var alerts = jsonElement.GetProperty("features").EnumerateArray();
|
||||
|
||||
if (!alerts.Any())
|
||||
|
|
@ -1510,56 +1516,34 @@ public static class WeatherTools
|
|||
return "No active alerts for this state.";
|
||||
}
|
||||
|
||||
// Process the alerts and return a formatted string
|
||||
var alertMessages = new List<string>();
|
||||
foreach (var alert in alerts)
|
||||
return string.Join("\n--\n", alerts.Select(alert =>
|
||||
{
|
||||
JsonElement properties = alert.GetProperty("properties");
|
||||
alertMessages.Add($"""
|
||||
return $"""
|
||||
Event: {properties.GetProperty("event").GetString()}
|
||||
Area: {properties.GetProperty("areaDesc").GetString()}
|
||||
Severity: {properties.GetProperty("severity").GetString()}
|
||||
Description: {properties.GetProperty("description").GetString()}
|
||||
Instruction: {properties.GetProperty("instruction").GetString()}
|
||||
""");
|
||||
}
|
||||
return string.Join("\n---\n", alertMessages);
|
||||
""";
|
||||
}));
|
||||
}
|
||||
|
||||
[McpServerTool, Description("Get weather forecast for a location.")]
|
||||
public static async Task<string> GetForecast(
|
||||
HttpClient client,
|
||||
[Description("Latitude of the location.")] double latitude,
|
||||
[Description("Longitude of the location.")] double longitude)
|
||||
{
|
||||
using HttpClient client = GetWeatherClient();
|
||||
var response = await client.GetAsync($"/points/{latitude},{longitude}");
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
return "Failed to retrieve forecast.";
|
||||
}
|
||||
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
var jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
|
||||
var jsonElement = await client.GetFromJsonAsync<JsonElement>($"/points/{latitude},{longitude}");
|
||||
var periods = jsonElement.GetProperty("properties").GetProperty("periods").EnumerateArray();
|
||||
// Process the forecast and return a formatted string
|
||||
var forecastMessages = new List<string>();
|
||||
foreach (var period in periods)
|
||||
{
|
||||
forecastMessages.Add($"""
|
||||
|
||||
return string.Join("\n---\n", periods.Select(period => $"""
|
||||
{period.GetProperty("name").GetString()}
|
||||
Temperature: {period.GetProperty("temperature").GetInt32()}°F
|
||||
Wind: {period.GetProperty("windSpeed").GetString()} {period.GetProperty("windDirection").GetString()}
|
||||
Forecast: {period.GetProperty("detailedForecast").GetString()}
|
||||
""");
|
||||
}
|
||||
return string.Join("\n---\n", forecastMessages);
|
||||
}
|
||||
|
||||
private static HttpClient GetWeatherClient()
|
||||
{
|
||||
var client = new HttpClient() { BaseAddress = new Uri("https://api.weather.gov") };
|
||||
client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("weather-tool", "1.0"));
|
||||
return client;
|
||||
"""));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
|
|||
Loading…
Reference in a new issue