探索 MCP C# SDK:实现大语言模型与应用的无缝对接
探索 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:实现大语言模型与应用的无缝对接的更多相关文章
- Hugging News #0324: 🤖️ 黑客松结果揭晓、一键部署谷歌最新大语言模型、Gradio 新版发布,更新超多!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话
导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...
- 短视频 SDK 6大功能技术实现方式详解
第三方短视频解决方案作为快速切入短视频行业的首选方式,选择一款功能齐全.性能优异的短视频解决方案十分重要. 今天我们来谈谈短视频 SDK 6大重要功能点及其技术实现方式. 短视频拍摄 断点续拍 指在拍 ...
- offset新探索:双管齐下,加速大数据量查询
摘要:随着offset的增加,查询的时长也会越来越长.当offset达到百万级别的时候查询时长通常是业务所不能容忍的. 本文分享自华为云社区<offset新探索:双管齐下,加速大数据量查询> ...
- 本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT
OpenAI公司基于GPT模型的ChatGPT风光无两,眼看它起朱楼,眼看它宴宾客,FaceBook终于坐不住了,发布了同样基于LLM的人工智能大语言模型LLaMA,号称包含70亿.130亿.330亿 ...
- 使用 LoRA 和 Hugging Face 高效训练大语言模型
在本文中,我们将展示如何使用 大语言模型低秩适配 (Low-Rank Adaptation of Large Language Models,LoRA) 技术在单 GPU 上微调 110 亿参数的 F ...
- pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例)
pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例) Part1知识准备 在PyTorch中加载预训练的模型时,通常的工作流程是这样的: my_model = ModelClass ...
- 大语言模型快速推理: 在 Habana Gaudi2 上推理 BLOOMZ
本文将展示如何在 Habana Gaudi2 上使用 Optimum Habana.Optimum Habana 是 Gaudi2 和 Transformers 库之间的桥梁.本文设计并实现了一个大模 ...
- LLM(大语言模型)解码时是怎么生成文本的?
Part1配置及参数 transformers==4.28.1 源码地址:transformers/configuration_utils.py at v4.28.1 · huggingface/tr ...
- 5路数字量输入Di,5路大电流继电器输出,可电脑控制,支持modbus协议工业模块,支持和DCS,PLC无缝对接。
数字量输入输出模块MRD-5060具有5路DI,5路继电器输出,1路485接口(支持Modbus RTU),能实现5路DI(干接点输入)转485的采集,也可以通过485控制5路继电器(5A30VDC, ...
随机推荐
- 为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?
为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)? 在 Java 8 中,JVM 移除了 永久代(PermGen)并引入了 元空间(Metaspace),这一改 ...
- blk_mq多队列块设备浅析
1. 为什么要使用多队列 在主机中,多cpu运行多个线程,每个线程都能和文件系统交互,文件系统层也是用多线程和bio层交互,但是,块设备层只有一个队列: 在块设备层,来自多个cpu的bio请求被放在同 ...
- s2-061(CVE-2020-17530)漏洞复现+利用+getshell工具。
声明 本文仅用于技术交流,请勿用于非法用途 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 文章作者拥有对此文章的修改和解释权.如 ...
- GPUStack v0.5:模型Catalog、图生图功能上线,多维优化全面提升产品能力与使用体验
GPUStack 是一个专为运行 AI 模型设计的开源 GPU 集群管理器,致力于支持基于任何品牌的异构 GPU 构建统一管理的算力集群.无论这些 GPU 运行在 Apple Mac.Windows ...
- 前端开发者狂喜!30K star开源组件库,界面美观度/开发速度双碾压!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 在前端开发的浩瀚海洋中,寻找一款既能提升开发效率,又能保证界面美观的 UI 组件库,犹如大海 ...
- 手把手部署n8n
n8n 是当前非常热门的开源 AI 工作流平台,在 GitHub 上已获得超过九万颗 star. 通过 n8n,用户可以拖拽节点,轻松搭建复杂的 AI 工作流.每个节点都支持上千种插件,可灵活集成各类 ...
- C# Environment.CurrentDirectory和AppDomain.CurrentDomain.BaseDirectory的区别
Environment.CurrentDirectory 和 AppDomain.CurrentDomain.BaseDirectory 都是C#中用于获取当前应用程序的目录路径的方法,但是它们的用途 ...
- Django中图片不显示
很多教程没教对,导致Django中的图片不能正确的显示出来,经过多次踩坑,发现如下方法可以解决该问题. 1.setting.py中添加: STATIC_URL = '/static/' STATICF ...
- Spring IoC容器添加组件的方式
小编在博文<Spring Bean是什么>中介绍了Bean的基本概念,这里详细地介绍如何注册bean. 1.包扫描@ComponentScan+组件标注注解 适用场景:可以通过该方 ...
- 代码随想录第六天 | 哈希表part02
454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开 ...