探索 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, ...
随机推荐
- Asp.net core 少走弯路系列教程(二)HTML 学习
前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...
- 代码随想录第九天 | Leecode 151.翻转字符串里的单词、Leecode 28. 找出字符串中第一个匹配项的下标、Leecode 459.重复的子字符串
Leecode 151.翻转字符串里的单词 题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/ 题目描述 ...
- HarmonyOS NEXT开发实战案例--抽奖转盘
这是之前写过的一个项目,后来删掉了,现在适配到api12重新发布,友友们按需查阅. 本文主要通过抽奖转盘小项目讲解在鸿蒙开发中如何使用画布组件Canvas绘制图形和文字,以及转圈动画的实现.效果图如下 ...
- vue3 基础-API-computed
前些章节讲了一些常用的 api 如 setup, ref, reactive, toRef ... 等, 并以一个 todoList 的小案例来体现在 vue3 中如何进行解耦逻辑, 以 setup ...
- 网络编程:反应堆_I/O模型和多线程模型实现
多线程设计的几个考虑 在反应堆reactor框架设计中,main reactor线程是一个acceptor线程,这个线程一旦创建,会以event_loop形式阻塞在event_dispatcher的d ...
- geekai开源项目二次开发 AI大模型 AI 助手全套开源解决方案
geekai-django 基于极客学长大佬的开源项目geekai 二次开发而来. GeekAI 是基于 AI 大语言模型 API 实现的 AI 助手全套开源解决方案,自带运营管理后台,开箱即用. 介 ...
- odoo前端的Patch用法
一.Patching code:根据官方功能解释 我们需要自定义 UI 的工作方式.一些受支持的 API 涵盖了许多常见需求. 例如,所有注册表都是很好的扩展点: 字段注册表允许添加/删除专门的字段组 ...
- Spring注解之自定义注解入门
目录 前言 注解是什么 自定义注解 元注解 @Target @Retention @Documented @Inherited 结束语 Reference 前言 在业务开发过程中,Spring 框 ...
- Pod原理以及Pod生命周期
一.Pod的介绍 1.为什么需要Pod? 假设 Kubernetes 中调度的基本单元就是容器,对于一个非常简单的应用可以直接被调度直接使用,没有什么问题,但是往往还有很多应用程序是由多个进程组成的, ...
- AI时代Hello World详细教程之LLM微调(SFT)
[00]时代变了 移动互联网时代的Hello World(参见Xamarin 使用极光推送 详细教程 ),安装某一套开发工具包(IDE)就够了,AI时代就明显要的就多了. 依然直奔主题,无废话,直接上 ...