探索 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 客户端,该客户端连接到服务器并调用可用的工具。

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 服务器,该服务器提供工具供客户端调用。

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 获取内容并进行摘要的工具。

[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 有更多兴趣,可以查看官方文档和示例代码,进一步探索这个令人兴奋的领域。

小智MCP示例项目

https://github.com/zhulige/xiaozhi-sharp

探索 MCP C# SDK:实现大语言模型与应用的无缝对接的更多相关文章

  1. Hugging News #0324: 🤖️ 黑客松结果揭晓、一键部署谷歌最新大语言模型、Gradio 新版发布,更新超多!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  2. 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话

    导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...

  3. 短视频 SDK 6大功能技术实现方式详解

    第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍 ...

  4. offset新探索:双管齐下,加速大数据量查询

    摘要:随着offset的增加,查询的时长也会越来越长.当offset达到百万级别的时候查询时长通常是业务所不能容忍的. 本文分享自华为云社区<offset新探索:双管齐下,加速大数据量查询> ...

  5. 本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT

    OpenAI公司基于GPT模型的ChatGPT风光无两,眼看它起朱楼,眼看它宴宾客,FaceBook终于坐不住了,发布了同样基于LLM的人工智能大语言模型LLaMA,号称包含70亿.130亿.330亿 ...

  6. 使用 LoRA 和 Hugging Face 高效训练大语言模型

    在本文中,我们将展示如何使用 大语言模型低秩适配 (Low-Rank Adaptation of Large Language Models,LoRA) 技术在单 GPU 上微调 110 亿参数的 F ...

  7. pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例)

    pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例) Part1知识准备 在PyTorch中加载预训练的模型时,通常的工作流程是这样的: my_model = ModelClass ...

  8. 大语言模型快速推理: 在 Habana Gaudi2 上推理 BLOOMZ

    本文将展示如何在 Habana Gaudi2 上使用 Optimum Habana.Optimum Habana 是 Gaudi2 和 Transformers 库之间的桥梁.本文设计并实现了一个大模 ...

  9. LLM(大语言模型)解码时是怎么生成文本的?

    Part1配置及参数 transformers==4.28.1 源码地址:transformers/configuration_utils.py at v4.28.1 · huggingface/tr ...

  10. 5路数字量输入Di,5路大电流继电器输出,可电脑控制,支持modbus协议工业模块,支持和DCS,PLC无缝对接。

    数字量输入输出模块MRD-5060具有5路DI,5路继电器输出,1路485接口(支持Modbus RTU),能实现5路DI(干接点输入)转485的采集,也可以通过485控制5路继电器(5A30VDC, ...

随机推荐

  1. Java 中的字符串常量池和运行时常量池

    Java 中的字符串常量池和运行时常量池 1. 字符串常量池(String Constant Pool) 定义 字符串常量池是 JVM 内存中专门用于存储字符串字面量和通过 intern() 方法加入 ...

  2. MySQL 参考资料

    官方文档:https://dev.mysql.com/doc/refman/5.7/en/ 书: 1.<高性能MySQL> 2.<MySQL是怎样运行的:从根儿上理解MySQL> ...

  3. 线上救急-AWS限频

    线上救急-AWS限频 问题 在一个天气炎热的下午,我正喝着可口可乐,悠闲地看着Cursor生成代码,忽然各大群聊中出现了加急@全体的消息,当时就心里一咯噔,点开一看,果然,线上服务出问题,多个能源统计 ...

  4. SpringBoot项目创建的三种方式

    目录 1 通过官网创建 2 通过IDEA脚手架创建 2.1 IDEA新建项目 2.2 起Group名字,选择Java版本,点击Next 2.3 选择Web依赖,选择Spring Web,确认Sprin ...

  5. windows 配置jdk8环境变量

    JAVA_HOME: E:\Android\Java\jdk1.8.0_131 PATH: %JAVA_HOME\%bin 也可以只配置PATH就可以,如 E:\Android\Java\jdk1.8 ...

  6. SQL 日常练习 (十六)

    最近接触了一波 RPA, 可以用来做一些数据采集的事情, 或者任意控制电脑上的软件, 感觉上是挺厉害的, 但我就是不想用, 尽管我尝试了一波, 最后还是放弃 了, 我还是喜欢纯代码的工作方式, 最为讨 ...

  7. 提高Flutter应用性能的最佳实践

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  8. 应用内存管理:Linux的应用与内存管理

    应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节. 硬件架构 现代计算机体系结构被称为Non-Uniform Memory ...

  9. Django踩坑之ExtendsNode: extends 'base/base.html'> must be the first tag in the template.

    模板继承报错: extends 'base/base.html'> must be the first tag in the template base.html如下: <!-- {% l ...

  10. 3 MyBatis动态SQL之set标签|转

    1 MyBatis动态SQL之if 语句 2 MyBatis动态sql之where标签|转 3 MyBatis动态SQL之set标签|转 4 MyBatis动态SQL之trim元素|转 5 MyBat ...