探索 MCP C# SDK:实现大语言模型与应用的无缝对接
在当今人工智能快速发展的时代,大语言模型(LLMs)已经成为众多应用的核心驱动力。然而,如何让这些强大的模型与各种数据源和工具进行有效集成,仍然是一个挑战。Model Context Protocol(MCP)正是为解决这一问题而设计的开放协议,它标准化了应用程序如何向大语言模型提供上下文信息。本文将介绍 MCP 的基本概念,并通过 C# SDK 展示如何实现客户端和服务器端的交互。
什么是 MCP?
Model Context Protocol(MCP)是一种开放协议,旨在标准化应用程序如何向大语言模型(LLMs)提供上下文信息。它允许安全地集成大语言模型与各种数据源和工具,使 LLMs 能够更智能地与外部系统交互。MCP 的核心优势在于它的灵活性和互操作性,支持不同的传输协议和数据格式。
MCP C# SDK 概述
MCP C# SDK 是官方提供的用于 .NET 应用程序的开发工具包,它使开发者能够轻松实现 MCP 客户端和服务器。该 SDK 包含三个主要包:
- ModelContextProtocol:主包,包含主机和依赖注入扩展,适合大多数不需要 HTTP 服务器功能的项目。
- ModelContextProtocol.AspNetCore:基于 HTTP 的 MCP 服务器库。
- ModelContextProtocol.Core:提供客户端和低级服务器 API,依赖最少。
接下来,我们将通过具体示例展示如何使用 MCP C# SDK 实现客户端和服务器端功能。
实现 MCP 客户端
首先,让我们看看如何实现一个简单的 MCP 客户端,该客户端连接到服务器并调用可用的工具。
csharp
using ModelContextProtocol.Client;
using ModelContextProtocol.Transport;
using System.CommandLine;
// 创建标准输入输出客户端传输
var clientTransport = new StdioClientTransport(new StdioClientTransportOptions
{
Name = "Everything",
Command = "npx",
Arguments = ["-y", "@modelcontextprotocol/server-everything"],
});
// 创建并连接客户端
var client = await McpClientFactory.CreateAsync(clientTransport);
// 列出所有可用工具
Console.WriteLine("可用工具列表:");
foreach (var tool in await client.ListToolsAsync())
{
Console.WriteLine($"- {tool.Name}: {tool.Description}");
}
// 调用 echo 工具
var result = await client.CallToolAsync(
"echo",
new Dictionary<string, object?>() { ["message"] = "Hello MCP!" },
cancellationToken: CancellationToken.None);
// 输出结果
Console.WriteLine("\n调用 echo 工具结果:");
Console.WriteLine(result.Content.First(c => c.Type == "text").Text);
在这个示例中,我们首先创建了一个标准输入输出客户端传输,它连接到一个基于 Node.js 的 MCP 服务器。然后,我们使用 McpClientFactory 创建并连接客户端,列出所有可用工具,并调用其中一个工具(echo)。
实现 MCP 服务器
现在,让我们看看如何实现一个简单的 MCP 服务器,该服务器提供工具供客户端调用。
csharp
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ModelContextProtocol.Server;
using System.ComponentModel;
// 创建主机构建器
var builder = Host.CreateApplicationBuilder(args);
builder.Logging.AddConsole(consoleLogOptions =>
{
// 配置所有日志输出到标准错误
consoleLogOptions.LogToStandardErrorThreshold = LogLevel.Trace;
});
// 配置 MCP 服务器
builder.Services
.AddMcpServer()
.WithStdioServerTransport()
.WithToolsFromAssembly();
// 构建并运行主机
await builder.Build().RunAsync();
// 定义一个简单的工具类
[McpServerToolType]
public static class EchoTool
{
[McpServerTool, Description("Echoes the message back to the client.")]
public static string Echo(string message) => $"Echo: {message}";
}
这个示例展示了如何创建一个简单的 MCP 服务器。我们使用 Microsoft.Extensions.Hosting 创建一个主机应用程序,并配置 MCP 服务器使用标准输入输出传输。然后,我们定义了一个简单的工具类 EchoTool,其中包含一个 Echo 方法,用于将输入的消息回显给客户端。
高级工具实现
MCP 还支持更复杂的工具实现,例如需要依赖注入或与客户端交互的工具。下面是一个示例,展示了如何实现一个从 URL 获取内容并进行摘要的工具。
csharp
[McpServerTool(Name = "SummarizeContentFromUrl"), Description("Summarizes content downloaded from a specific URI")]
public static async Task<string> SummarizeDownloadedContent(
IMcpServer thisServer,
HttpClient httpClient,
[Description("The url from which to download the content to summarize")] string url,
CancellationToken cancellationToken)
{
// 从 URL 获取内容
string content = await httpClient.GetStringAsync(url);
// 创建聊天消息
ChatMessage[] messages =
[
new(ChatRole.User, "Briefly summarize the following downloaded content:"),
new(ChatRole.User, content),
];
// 配置聊天选项
ChatOptions options = new()
{
MaxOutputTokens = 256,
Temperature = 0.3f,
};
// 使用服务器作为采样聊天客户端获取摘要
return $"Summary: {await thisServer.AsSamplingChatClient().GetResponseAsync(messages, options, cancellationToken)}";
}
这个工具接受一个 URL 参数,使用注入的 HttpClient 下载内容,然后使用注入的 IMcpServer 与客户端交互,请求客户端对内容进行摘要。
总结
MCP C# SDK 为 .NET 开发者提供了一个强大而灵活的工具,用于实现与大语言模型的无缝集成。通过标准化的协议,开发者可以更轻松地构建能够与各种数据源和工具交互的智能应用程序。
本文展示了如何使用 MCP C# SDK 实现基本的客户端和服务器功能,以及如何创建简单和复杂的工具。随着人工智能技术的不断发展,像 MCP 这样的协议将变得越来越重要,因为它们提供了一种标准化的方式来连接不同的系统和组件。
如果你对 MCP 或 C# SDK 有更多兴趣,可以查看官方文档和示例代码,进一步探索这个令人兴奋的领域。