diff --git a/clients.mdx b/clients.mdx index 37d1a6c..2a45744 100644 --- a/clients.mdx +++ b/clients.mdx @@ -15,10 +15,11 @@ This page provides an overview of applications that support the Model Context Pr | [BeeAI Framework][BeeAI Framework] | ❌ | ❌ | ✅ | ❌ | ❌ | Supports tools in agentic workflows. | | [Cline][Cline] | ✅ | ❌ | ✅ | ❌ | ❌ | Supports tools and resources. | | [Continue][Continue] | ✅ | ✅ | ✅ | ❌ | ❌ | Full support for all MCP features | +| [Copilot-MCP][CopilotMCP] | ✅ | ❌ | ✅ | ❌ | ❌ | Supports tools and resources. | | [Cursor][Cursor] | ❌ | ❌ | ✅ | ❌ | ❌ | Supports tools. | | [Emacs Mcp][Mcp.el] | ❌ | ❌ | ✅ | ❌ | ❌ | Supports tools in Emacs. | | [fast-agent][fast-agent] | ✅ | ✅ | ✅ | ✅ | ✅ | Full multimodal MCP support, with end-to-end tests | -| [Firebase Genkit][Genkit] | ⚠️ | ✅ | ✅ | ❌ | ❌ | Supports resource list and lookup through tools. | +| [Genkit][Genkit] | ⚠️ | ✅ | ✅ | ❌ | ❌ | Supports resource list and lookup through tools. | | [GenAIScript][GenAIScript] | ❌ | ❌ | ✅ | ❌ | ❌ | Supports tools. | | [Goose][Goose] | ❌ | ❌ | ✅ | ❌ | ❌ | Supports tools. | | [LibreChat][LibreChat] | ❌ | ❌ | ✅ | ❌ | ❌ | Supports tools for Agents | @@ -60,6 +61,7 @@ This page provides an overview of applications that support the Model Context Pr [Goose]: https://block.github.io/goose/docs/goose-architecture/#interoperability-with-extensions [Witsy]: https://github.com/nbonamy/witsy [Windsurf]: https://codeium.com/windsurf +[CopilotMCP]: https://github.com/VikashLoomba/copilot-mcp [Daydreams]: https://github.com/daydreamsai/daydreams [SpinAI]: https://spinai.dev [OpenSumi]: https://github.com/opensumi/core @@ -149,8 +151,8 @@ Claude Code is an interactive agentic coding tool from Anthropic that helps you - Built in support for "Building Effective Agents" workflows. - Deploy Agents as MCP Servers -### Firebase Genkit -[Genkit](https://github.com/firebase/genkit) is Firebase's SDK for building and integrating GenAI features into applications. The [genkitx-mcp](https://github.com/firebase/genkit/tree/main/js/plugins/mcp) plugin enables consuming MCP servers as a client or creating MCP servers from Genkit tools and prompts. +### Genkit +[Genkit](https://github.com/firebase/genkit) is a cross-language SDK for building and integrating GenAI features into applications. The [genkitx-mcp](https://github.com/firebase/genkit/tree/main/js/plugins/mcp) plugin enables consuming MCP servers as a client or creating MCP servers from Genkit tools and prompts. **Key features:** - Client support for tools and prompts (resources partially supported) diff --git a/examples.mdx b/examples.mdx index 2969bcc..c890b84 100644 --- a/examples.mdx +++ b/examples.mdx @@ -57,6 +57,7 @@ These MCP servers are maintained by companies for their platforms: A growing ecosystem of community-developed servers extends MCP's capabilities: +- **[BreakoutRoom](https://github.com/agree-able/room-mcp)** - Agents accomplishing goals together in p2p rooms - **[Docker](https://github.com/ckreiling/mcp-server-docker)** - Manage containers, images, volumes, and networks - **[Kubernetes](https://github.com/Flux159/mcp-server-kubernetes)** - Manage pods, deployments, and services - **[Linear](https://github.com/jerhadf/linear-mcp-server)** - Project management and issue tracking diff --git a/quickstart/client.mdx b/quickstart/client.mdx index 68e61da..c98984b 100644 --- a/quickstart/client.mdx +++ b/quickstart/client.mdx @@ -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()] + 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 diff --git a/quickstart/server.mdx b/quickstart/server.mdx index 57767a5..920cc80 100644 --- a/quickstart/server.mdx +++ b/quickstart/server.mdx @@ -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 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(json); + var jsonElement = await client.GetFromJsonAsync($"/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(); - 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 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(json); + var jsonElement = await client.GetFromJsonAsync($"/points/{latitude},{longitude}"); var periods = jsonElement.GetProperty("properties").GetProperty("periods").EnumerateArray(); - // Process the forecast and return a formatted string - var forecastMessages = new List(); - foreach (var period in periods) - { - forecastMessages.Add($""" - {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; + 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()} + """)); } } ```