将MCP(ModelContextProtocol)与Semantic Kernel集成(调用github)
文章目录
- 将MCP(ModelContextProtocol)与Semantic Kernel集成(调用github)
- 一、模型上下文协议(MCP)简介
- 1.1 简介
- 1.2 示例
- 二、集成步骤
- 2.1 安装环境依赖
- 2.2 构建语义内核(Kernel)
- 2.3 创建MCP客户端
- 2.4 获取MCP工具
- 2.5 将MCP工具转换为Kernel函数
- 2.6 通过函数调用MCP工具
- 三、完整代码示例
- 四、总结
将MCP(ModelContextProtocol)与Semantic Kernel集成(调用github)
在当今快速发展的技术领域,人工智能(AI)的应用正在不断拓展和深化。为了更好地将AI模型与各种数据源和工具连接起来,模型上下文协议(Model Context Protocol, MCP) 应运而生。MCP是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。本文将详细介绍如何将MCP工具与 语义内核(Semantic Kernel) 集成,以实现更强大的AI功能。
一、模型上下文协议(MCP)简介
1.1 简介
模型上下文协议(MCP)是一种开放协议,它标准化了应用程序如何向大型语言模型(LLM)提供上下文信息。MCP通过定义统一的接口,使得不同的数据源和工具能够与AI模型进行无缝连接。这种标准化的连接方式不仅提高了系统的互操作性,还增强了AI模型对上下文的理解能力,从而为用户提供更加精准和智能的服务。
MCP的潜在应用场景包括数据集成、知识管理等,对于开发先进的AI解决方案具有重要意义。
本文介绍了如何将 Model Context Protocol 工具与 Semantic Kernel 结合使用。模型上下文协议 (MCP) 是一种开放协议,用于标准化应用程序如何为 LLM 提供上下文。MCP 标准化了 AI 模型与各种数据源和工具之间的连接。
模型上下文协议非常重要,因为它增强了 AI 模型与数据和工具的交互方式,促进了互作性、灵活性并改进了上下文理解。它的潜在应用涵盖各个领域,包括数据集成和知识管理,使其成为开发高级 AI 解决方案的重要组成部分。
1.2 示例
本文中描述的示例侧重于通过函数调用将 AI 模型连接到 MCP 工具。
有关模型上下文协议 (MCP) 的更多信息,请参阅文档。
下面描述的此示例使用官方 ModelContextProtocol 包,受这些示例的影响。
该示例显示:
- 如何使用 ModelContextProtocol 连接到 MCP 服务器
- 检索 MCP 服务器提供的工具列表
- 将 MCP 工具转换为 Semantic Kernel 函数,以便将它们添加到 Kernel 实例中
- 从 Semantic Kernel 调用 MCP 工具以响应 LLM 函数调用请求
二、集成步骤
2.1 安装环境依赖
dotnet add package ModelContextProtocol --prerelease
dotnet add package SemanticKernel
2.2 构建语义内核(Kernel)
在开始集成之前,我们需要构建一个语义内核(Kernel)实例。Kernel是语义内核的核心组件,负责管理和执行各种AI功能。在本示例中,我们将使用OpenAI的Chat Completion模型,因此需要提供有效的API密钥。
var builder = Kernel.CreateBuilder();
builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace));
builder.Services.AddOpenAIChatCompletion(modelId: "glm-4-flash",// 这里使用了智谱的免费模型,可按需替换其他模型endpoint: new Uri("https://open.bigmodel.cn/api/paas/v4"),apiKey: "YOUR KEY");
Kernel kernel = builder.Build();
2.3 创建MCP客户端
MCP采用客户端-服务器架构,客户端通过MCP协议与服务器建立一对一连接。在本示例中,我们将创建一个MCP客户端,连接到本地运行的GitHub服务器。
- MCP 主机:希望通过 MCP 访问数据的 IDE 或 AI 工具等程序
- MCP 客户端:与服务器保持 1:1 连接的协议客户端
- MCP 服务器:轻量级程序,每个程序都通过标准化的 Model Context Protocol 公开特定功能
什么是 npx?
npx 是 Node.js 附带的命令行工具(从版本 5.2.0 开始),是 npm(Node Package Manager)生态系统的一部分。它用于直接从命令行执行Node.js包,而无需在系统上全局安装它们。
// 创建一个MCPClient GitHub的服务器
await using IMcpClient mcpClient = await McpClientFactory.CreateAsync(new StdioClientTransport(new()
{Name = "GitHub",Command = "npx",Arguments = ["-y", "@modelcontextprotocol/server-github"],
}));
2.4 获取MCP工具
MCP服务器可以将可执行功能作为工具暴露给客户端。这些工具可以被LLM调用,从而实现与外部系统的交互。通过以下代码,我们可以获取GitHub服务器提供的工具列表,并打印每个工具的名称和描述。
// 获取GitHub服务器上可用的工具列表
var tools = await mcpClient.ListToolsAsync().ConfigureAwait(false);
foreach (var tool in tools.Tools)
{Console.WriteLine($"{tool.Name}: {tool.Description}");
}
GitHub MCP服务器提供了多种工具,例如创建或更新文件、搜索仓库、创建问题等。
2.5 将MCP工具转换为Kernel函数
为了在语义内核中使用MCP工具,我们需要将它们转换为Kernel函数。Kernel函数是语义内核中表示工具的抽象。通过以下代码,我们可以将MCP工具转换为Kernel函数,并将其添加到Kernel实例中。
kernel.Plugins.AddFromFunctions("GitHub", tools.Select(aiFunction => aiFunction.AsKernelFunction()));
2.6 通过函数调用MCP工具
将MCP工具转换为Kernel函数后,我们就可以在Kernel中使用它们了。以下是一个示例,展示如何通过函数调用获取GitHub仓库的最近四次提交。
OpenAIPromptExecutionSettings executionSettings = new()
{Temperature = 0,FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new() { RetainArgumentTypes = true })
};var prompt = "总结最后四次提交到microsoft/semantic-kernel存储库的情况?";
var result = await kernel.InvokePromptAsync(prompt, new(executionSettings)).ConfigureAwait(false);
Console.WriteLine($"\n\n{prompt}\n{result}");
注:获取github提交信息失败,实际上已经调用了mcp了,前面测试还可以,写博客时一直失败,后续会再排查原因
三、完整代码示例
// 创建一个MCPClient GitHub的服务器await using var mcpClient = await McpClientFactory.CreateAsync(new StdioClientTransport(new(){Name = "MCPServer",Command = "npx",Arguments = ["-y", "@modelcontextprotocol/server-github"],}));// 获取GitHub服务器上可用的工具列表var tools = await mcpClient.ListToolsAsync().ConfigureAwait(false);foreach (var tool in tools){Console.WriteLine($"{tool.Name}: {tool.Description}");}// 构建内核与MCP工具内核函数var builder = Kernel.CreateBuilder();builder.Services.AddLogging(c => c.AddDebug().SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace)).AddOpenAIChatCompletion(modelId: "glm-4-flash",endpoint: new Uri("https://open.bigmodel.cn/api/paas/v4"),apiKey: "YOUR KEY");Kernel kernel = builder.Build();
#pragma warning disable SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。kernel.Plugins.AddFromFunctions("GitHub", tools.Select(aiFunction => aiFunction.AsKernelFunction()));
#pragma warning restore SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。// 开启函数自动调用
#pragma warning disable SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。OpenAIPromptExecutionSettings executionSettings = new(){Temperature = 0,FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new() { RetainArgumentTypes = true })};
#pragma warning restore SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。// 测试使用GitHub工具//var prompt = "Summarize the last four commits to the microsoft/semantic-kernel repository?";var prompt = "总结最后四次提交到microsoft/semantic-kernel存储库的情况?";var result = await kernel.InvokePromptAsync(prompt, new(executionSettings)).ConfigureAwait(false);Console.WriteLine($"\n\n{prompt}\n{result}");
四、总结
通过将MCP工具与语义内核集成,能够实现对GitHub数据的高效访问和操作。这种集成不仅提高了系统的灵活性和互操作性,还为开发者提供了更加便捷的方式来构建智能应用程序。
注:如果遇到下面报错,说明电脑上没装Node.js,需要进行安装。
相关文章:

将MCP(ModelContextProtocol)与Semantic Kernel集成(调用github)
文章目录 将MCP(ModelContextProtocol)与Semantic Kernel集成(调用github)一、模型上下文协议(MCP)简介1.1 简介1.2 示例 二、集成步骤2.1 安装环境依赖2.2 构建语义内核(Kernel)2.3…...

游戏引擎学习第311天:支持手动排序
仓库: https://gitee.com/mrxiao_com/2d_game_7(已满) 新仓库: https://gitee.com/mrxiao_com/2d_game_8 回顾并为今天的内容定下基调 我们接下来要继续完成之前开始的工作,上周五开始的部分内容,虽然当时对最终效果还不太确定,但现在主要任…...

LambdaQueryWrapper、MybatisPlus提供的基本接口方法、增删改查常用的接口方法、自定义 SQL
DAY26.2 Java核心基础 MybatisPlus提供的基本接口方法 分页查询 导入依赖springboot整合Mybatis-plus <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version&g…...

深度学习---可视化
模型可视化 深度学习模型可视化是理解、调试和优化模型的关键技术,涉及模型结构、参数、层输出、数据流动、训练过程等多维度分析。 一、可视化的核心作用 模型理解 解析复杂模型的网络架构(如CNN的层级连接、Transformer的注意力机制)。揭…...
军事大模型及其应用分析
一、军事大模型概述 在军事智能化浪潮下,大模型技术加速从理论迈向实战,成为重塑军事决策体系的核心力量,推动军事体系数字工程进入新阶段。 美国依托成熟的商业科技生态,率先推进大模型军事应用。Palantir 公司的 AIP 军事智能…...
c++算法题
题目 字符串的替换操作 replace(String &s, String &t, String &v) 是指: 若t是s的子串,则用串v替换串t在串s中的所有出现;若t不是s的子串,则串s不变。例如,若串s为“aabbabcbaabaaacbab”,串…...
云原生安全 SaaS :从基础到实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 1. 基础概念 什么是 SaaS? SaaS(Software as a Service,软件即服务)是一种基于云计算的软件交付模式。用…...
《Drain日志解析算法》论文阅读笔记
这篇文档介绍了一种名为Drain的在线日志解析方法,它采用固定深度的解析树进行流式日志处理 [cite: 1, 6]。 摘要 日志记录了宝贵的系统运行时信息,广泛应用于Web服务管理中 [cite: 1]。典型的日志分析过程首先需要解析原始日志消息,因为它们…...
MMAction2重要的几个配置参数
embed_dims(全称 embedding dimensions)是指每个 patch(块)或特征的通道数/维度,是 Transformer 或 Swin Transformer 等模型中最核心的特征表示维度。 embed_dims 必须能被 num_heads 整除 具体解释 在 Swin Transfo…...

Windows系统如何查看ssh公钥
很多人只是一味的为拿到ssh公钥而努力,往往却会忽略了ssh公钥与私钥背后的作用。 咱们在这里会花两分钟。 一分钟速通概念,一分钟教会你如何获取。 一分钟速通概念: 如何生成: SHH 公钥 与 私钥 是基于非对称加密算法ÿ…...
UniApp+Vue3微信小程序二维码生成、转图片、截图保存整页
二维码生成工具使用uqrcode/js,版本4.0.7 官网地址:uQRCode 中文文档(不建议看可能会被误导) 本项目采用了npm引入方式,也可通过插件市场引入,使用上会略有不同 准备工作: 安装:pnpm…...
8.2 线性变换的矩阵
一、线性变换的矩阵 本节将对每个线性变换 T T T 都指定一个矩阵 A A A. 对于一般的列向量,输入 v \boldsymbol v v 在空间 V R n \pmb{\textrm V}\pmb{\textrm R}^n VRn 中,输出 T ( v ) T(\boldsymbol v) T(v) 在空间 W R m \textrm{\pmb W}\…...

【2025】嵌入式软考中级部分试题
大题: 大模型 神经网络 机器学习 深度学习的包含关系 不一定对 订阅-发布者模型 发布/订阅模式特点: ①解耦:发布者和订阅者之间没有直接联系,它们通过中间的消息代理(如消息队列或事件总线)进行通信。这种解耦使得系统更加灵活,可以独立地添加或移除发布者和订阅者…...

Antd中Upload组件封装及使用:
1.Upload上传组件功能: 文件校验 : 文件格式校验/文件大小校验/上传文件总个数校验 相关功能 : 拖拽功能/上传到远程(七牛)/文件删除及下载 2.组件效果展示: 3.疑难点及解决方案: Promise.all多文件并行上传到远程(七牛云): (1)在beforeUpload钩子函数中获取token (2)循环fi…...

Linux环境基础开发工具->vim
引入:vim是什么? vs叫作继承开发环境,我们可以在里面编辑代码,调式代码,运行代码....这种叫集成开发环境;而vim只用来编辑代码,也就是类似于在windows上打开一个记事本来写代码的操作 集成开发…...

跳板问题(贪心算法+细节思考)
首先直接看题: 这题直接贪心其实问题不大: 下面先展示我的一个错误代码: # include<iostream> # include<vector> # include<algorithm>using namespace std;int main() {int N,M;cin>>N>>M;vector<vecto…...

RuoYi前后端分离框架集成UEditorPlus富文本编辑器
一、背景 采用若依框架搭建了一个小型的电子书项目,项目前端、后端、移动端就一人,电子书的章节内容是以富文本内容进行呈现的,产品设计人员直接给了一个第三方收费的富文本编辑器截图放到开发文档中,提了一沓需求点,概况下来就是要做成下图中的样子。作为一个后端开发人…...

IPD流程落地:项目任务书Charter开发
目录 简介 第一个方面,回答的是Why的问题。 第二点,要回答做什么的问题,也就是产品定义What的问题。 第三点就是要回答执行策略与计划的问题,也就是How、When、Who的问题。 第四点是对上述这些分析的总结分析,要为…...

Vue 2 混入 (Mixins) 的详细使用指南
1.基本概念 混入 (Mixins) 是 Vue 2 中用于组件代码复用的重要特性,它允许你将可复用的功能分发到多个组件中。 混入是一种灵活的代码复用方式,可以包含任意组件选项(data、methods、生命周期钩子等)。当组件使用混入时ÿ…...
day020-sed和find
文章目录 1. sed1.1 查找、过滤文本1.1.1 根据行号取行1.1.2 根据行号取范围1.1.3 过滤出指定行1.1.4 过滤出指定范围内容 1.2 替换文件内容1.2.1 将文件中虚拟用户命令解释器替换成/bin/bash1.2.2 修改原文件并备份1.2.3 为每行开头加上# 1.3 反向引用(后向引用&am…...
OpenGL Chan视频学习-4 Vertex Buffers and Drawing a Triangle in OpenGL
一、视频链接 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 二、相关网站 docs.gl 三、代码整理 c #include <GL/glew.h> #include <GLFW/glfw3.h>#include<iostream>int…...
数据库事务的四大特性(ACID)
一、前言 在现代数据库系统中,事务(Transaction)是确保数据一致性和完整性的重要机制。事务的四大特性——原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)…...
网络安全全知识图谱:威胁、防护、管理与发展趋势详解
1 网络安全基础概念 1.1 什么是网络安全 网络安全是指通过技术、管理和法律等手段,保护计算机网络系统中的硬件、软件及其系统中的数据,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,确保系统连续可靠正常地运行,网络服务不…...

FreeRTOS 在物联网传感器节点的应用:低功耗实时数据采集与传输方案
FreeRTOS 在物联网传感器节点的应用:低功耗实时数据采集与传输方案 二、FreeRTOS 任务划分与优先级设计 任务名称优先级执行周期功能描述Sensor_Collect3100ms多传感器数据采集与预处理Data_Process2事件驱动数据滤波/压缩/异常检测LoRa_Transmit41s低功耗长距离数…...
解决 iTerm2 中 nvm 不生效的问题(Mac 环境)
解决 iTerm2 中 nvm 不生效的问题(Mac 环境) 标题 《为什么 iTerm2 无法使用 nvm?—— 解决 Mac 终端环境变量冲突指南》 问题描述 许多开发者在 Mac 上使用 nvm 管理 Node.js 版本时,发现: 原生终端:n…...

Linux环境下基于Docker安装 PostgreSQL数据库并配置 pgvector
文章目录 1 docker-compose 安装 PostgreSQL 容器内安装 pgvector1.1 基于 docker-compose 安装 PostgreSQL 数据库1.2 容器内配置 pgvector 2. docker-compose Dockerfile 形式直接配置PostgreSQL数据库及 pgvector参考资料 PostgreSQL是一种功能强大的开源关系数据库管理系…...

(9)-java+ selenium->元素定位之By name
1.简介 上一篇已经介绍了通过id来定位元素,继续介绍其他剩下的七种定位方法中的通过name来定位元素。本文来介绍Webdriver中元素定位方法之By name,顾名思义,就是我们想要定位的目标元素节点上,有一个name ="value"的属性,这样我们就可以通过name的value直接去…...

深浅拷贝?
一、定义: 浅拷贝:只复制对象的第一层属性,若第一层属性是引用类型(如对象、数组),则复制其内存地址,修改拷贝后的嵌套对象会影响原对象。 深拷贝:递归复制对象的所有层级…...

Beckhoff PLC 功能块 FB_CTRL_ACTUAL_VALUE_FILTER (模拟量滤波)
1. 功能块概览 名称:FB_CTRL_ACTUAL_VALUE_FILTER(实际值滤波控制功能块)。作用:对测量输入值进行合理性检查( plausibility check )和滤波处理,防止异常跳变(如传感器信号突变&…...
Mysql在SQL层面的优化
以下是MySQL在SQL层面的优化方法及详细案例,结合实际场景说明如何通过调整SQL语句提升性能: 1. 确保索引有效使用 案例:订单状态查询优化 问题SQL: SELECT * FROM orders WHERE status shipped AND create_time > 2023-01-…...