当前位置: 首页 > news >正文

Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server

1.简单介绍

MCP是Model Context Protocol的缩写,是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源,工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中,目前最新版本是0.1.0-preview.7,相对之前的版本还是在不断更新的(发现最新版的McpClientFactory.CreateAsync方法好像有变更)。关于MCP的具体信息可以参考官方网站。

MCP使用的是client-server架构,下图为官网上面的一张图片

        

目前MCP client和MCP server交互使用的TransportType有两种,一种是Stdio(标准输入输出),另外一种是SSE(Server Sent Event),http目前还未支持。在集成本地command-line tool或者Shell脚本场景方面,Stdio可能适合些。SSE支持Server-to-Client streaming。

        

        

这边简单尝试一个MCP server去获取Microsoft 365 Planner中的Plan, Task信息,然后使用MCP Inspector去调用一下看看,

2.具体说明

2.1 准备阶段

假定存在一个Microsoft 365 Planner

        

在Microsoft 365 Planer中,一个Microsoft 365 Group对应多个Plan, 一个Plan对应多个Task的。

2.2 创建WebApi项目

1) 创建一个基于.NET9的Asp.NET Core WebApi项目

2) 添加nuget package ModelContextProtocol.AspNetCore (版本是0.1.0-preview.7) 

    添加了这个package,就不需要再为IEndpointRouteBuilder添加拓展方法了(MapMcpSse)

3)由于要获取Microsoft 365 Planer的信息,需要使用Microsfot Graph Rest Api,添加一下Microsoft Graph nuget package

        

 4) program.cs的代码如下

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMcpServer().WithToolsFromAssembly();
var app = builder.Build();
app.MapMcp();
app.Run();

note, 其中WithToolsFromAssembly方法会扫描程序集当中标注了[McpServerToolType] attribute的类进行注册的

 5)在项目中添加一个Tools文件夹,然后添加一个静态类

        

[McpServerToolType]
public static class M365PlannerInfoQueryTool
{...[McpServerTool, Description("List the Microsoft 365 Groups the user belong to")]public static string[] ListAllGroupsTheUserBelongTo(){...GraphServiceClient graphClient = _appClient!;var groupResponse = graphClient?.Groups.GetAsync().Result;var groups = groupResponse?.Value;List<string> groupList = new List<string>();foreach (var group in groups!){Console.WriteLine($"Group Display Name: {group.DisplayName} - Group Id: {group.Id}");groupList.Add($"Group Name: {group.DisplayName} - Group Id: {group.Id}");}return groupList.ToArray();}...
}

2.3 运行一下

运行项目后,这边得到的地址是http://localhost:5266

        

2.4 使用MCP Inspector测试

1) 在命令行中运行 npx @modelcontextprotocol/inspector

2) 在打开的MCP Inspector界面中,设定Transport Type为SSE,URL为之前运行起来的MCP Server地址http://localhost:5266/sse,点击Connect

        

连接成功之后的界面如下

        

3)点击  MCP Inspector界面右侧的List Tools按钮

        

发现MCP Server中有标注[McpServerTool] attribute的方法被列出来了,

        

4)点击第一个Tool - ListAllGroupsTheUserBelongTo,界面变成如下的样子

        

5)点击最右侧的Run Tool按钮,发现确实有结果返回,也就是MCP Server的方法被调用了

            

有了MCP Server之后,就可以在MCP Client中进行调用了, 在MCP Client中,可以结合大语言模型的能力进行MCP Server的 tool的调用。其实MCP使用也是基于Function Calling的。

假定尝试一下将MCP Client和GitHub Copilot extension结合起来(使用LLM),则运行效果如下

        

后续将会尝试一下在MCP Client中使用Semantic Kernel或者Microsoft.Extensions.AI。

3.总结

本文简单介绍了一下MCP的一些知识以及如何创建一个MCP Server。创建好的MCP Server也可以在VS Code中进行配置。配置好后,在GitHub Copilot界面中添加对应的tool,后续就可以基于自然语言进行tool的调用了。

本文如果哪里有错误,麻烦告之,谢谢谢谢!

相关文章:

Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server

1.简单介绍 MCP是Model Context Protocol的缩写&#xff0c;是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源&#xff0c;工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中&#xff0c;目前最新版本…...

Linux上位机开发实践(关于Qt的移植)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 linux平台上面&#xff0c;很多界面应用&#xff0c;都是基于qt开发的。不管是x86平台&#xff0c;还是arm平台&#xff0c;qt使用的地方都比较多。…...

Node.js 项目 用 `Docker Compose` 发布的完整流程

Node.js 项目 用 Docker Compose 发布的完整流程 ✅ 一、基本项目结构示例 以一个简单 Express 项目为例&#xff1a; my-node-app/ ├── app.js # 启动文件 ├── package.json ├── package-lock.json ├── Dockerfile # 构建 Node 容器 ├…...

Java基础:浅析Java中的XML文件处理

概述 XML&#xff08;全称Extensible Markup Language,可扩展标记语言&#xff09; .本质是一种数据的格式&#xff0c;可以用来存储复杂的数据结构&#xff0c;和数据关系 XML特点 1.XML中的“<标签名>”成为一个标签或者一个元素&#xff0c;一般成对出现的 2.XML…...

MCU刷写——S19(S-Record)文件格式详解及Python代码

工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊S19这种文件的格式,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢…...

HTML — 过渡与动画

HTML过渡与动画是提升网页交互体验的核心技术&#xff0c;主要通过CSS实现动态效果。 过渡 CSS过渡&#xff08;Transition&#xff09;介绍 适用于元素属性变化时的平滑渐变效果&#xff0c;如悬停变色、尺寸调整。通过定义transition-property&#xff08;过渡属性&#xf…...

python【标准库】multiprocessing

文章目录 介绍多进程Process 创建子进程共享内存数据多进程通信Pool创建子进程多进程案例多进程注意事项介绍 python3.10.17版本multiprocessing 是一个多进程标准模块,使用类似于threading模块的API创建子进程,充分利用多核CPU来并行处理任务。提供本地、远程的并发,高效避…...

BANK OF CHINA(HONG KONG)网点

BANK OF CHINA(HONG KONG)网点开户 ZoneBankAddressDates东区杏花邨分行香港柴湾杏花邨东翼商场205-208号20240415: 11:15, 13:00, 11:15, 13:00, 11:15, 13:0020240412: 11:15, 13:00东区鲗鱼涌分行香港鰂鱼涌英皇道1060号柏惠苑20240412: 09:45 注意事项 到达指定分行时&am…...

基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)

基于springboot的“嗨玩旅游网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…...

机器学习(3)——决策树

文章目录 1. 决策树基本原理1.1. 什么是决策树&#xff1f;1.2. 决策树的基本构成&#xff1a;1.3. 核心思想 2. 决策树的构建过程2.1. 特征选择2.1.1. 信息增益&#xff08;ID3&#xff09;2.1.2. 基尼不纯度&#xff08;CART&#xff09;2.1.3. 均方误差&#xff08;MSE&…...

【人脸识别中的“类内差异”和“类间差异】

核心问题&#xff1a;人脸识别中的“类内差异”和“类间差异” 想象你在教一个小朋友认人&#xff1a; 类间差异&#xff08;不同人之间的区别&#xff09;&#xff1a; 目标&#xff1a;让小朋友能分清“爸爸”和“妈妈”。方法&#xff1a;指着爸爸说“这是爸爸”&#xff0…...

第十六届蓝桥杯 省赛C/C++ 大学B组

编程题目现在在洛谷上都可以提交了。 未完待续&#xff0c;写不动了。 C11 编译命令 g A.cpp -o A -Wall -lm -stdc11A. 移动距离 本题总分&#xff1a;5 分 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标 ( 233 , 666 ) (233, 666) (233,666)。在移动过程…...

SpringBoot3.0 +GraalVM21 + Docker 打包成可执行文件

SpringBoot3.0 GraalVM21 Docker 打包成可执行文件 前言 随着时代的飞速发展&#xff0c;JDK 17 及以上版本开始支持通过 GraalVM 将运行在 JVM 上的 jar 包直接打包成可在操作系统上运行的原生可执行文件。这一特性能使开发者在某些场景下更加灵活地部署 Java 程序。 在云原…...

从编程范式看 “万物皆智能,万事皆自动” 愿景

从编程范式看“万物皆智能,万事皆自动”愿景 引言 在信息技术飞速发展的今天,“万物皆智能,万事皆自动”成为了众多 IT 从业者和科技爱好者心中的终极愿景。这一愿景描绘了一个所有事物都具备智能、所有事情都能自动完成的美好未来。而在实现这一愿景的征程中,面向对象编…...

Vue 项目中 package.json 文件的深度解析

Vue 项目中 package.json 文件的深度解析 在 Vue 项目中&#xff0c;package.json 文件是项目配置的核心&#xff0c;它管理着项目的依赖关系、脚本命令、版本信息等重要内容。正确理解和配置 package.json 文件&#xff0c;对于项目的开发、构建、测试和部署都至关重要。本文…...

解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题

使用蓝大的工作流《一键同时换头、换脸、发型、发色之双pulid技巧》 刚开始遇到的是不支持bf16的错误 根据《bf16 is only supported on A100 GPUs #33》中提到&#xff0c;修改pulidflux.py中的dtype 为 dtype torch.float16 后&#xff0c;出现新的错误&#xff0c;这个…...

1 程序的本质,计算机语言简史,TIOBE 指数,C 语言的独特魅力、发展历程、发行版本和应用场景

&#x1f44b; 嘿&#xff0c;各位编程探险家们&#xff01;是不是一提到 C 语言&#xff0c;脑海中就浮现出指针乱舞、内存泄漏的恐怖画面&#xff1f;别怕&#xff0c;你并不孤单&#xff01;&#x1f605; 今天&#xff0c;你踏入了这个专为 “C 语言恐惧症” 患者打造的避…...

python格式化字符串漏洞

什么是python格式化字符串漏洞 python中&#xff0c;存在几种格式化字符串的方式&#xff0c;然而当我们使用的方式不正确的时候&#xff0c;即格式化的字符串能够被我们控制时&#xff0c;就会导致一些严重的问题&#xff0c;比如获取敏感信息 python常见的格式化字符串 百…...

撰写学位论文Word图表目录的自动生成

第一步&#xff1a;为图片和表格添加题注 选中图片或表格 右键点击需要编号的图片或表格&#xff0c;选择 【插入题注】&#xff08;或通过菜单栏 引用 → 插入题注&#xff09;。 设置题注标签 在弹窗中选择 标签&#xff08;如默认有“图”“表”&#xff0c;若无需自定义标…...

SDC命令详解:使用相对路径访问设计对象(current_instance命令)

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 在使用get_cells等命令访问设计对象时&#xff0c;需要指定设计对象的名字&#xff0c;这个名字是一个相对路径&#xff0c;本文就将对此进行讨论。 相对路径 使…...

vector的应用

在平常使用c是&#xff0c;只使用普通数组肯定不够便捷&#xff0c;这时&#xff0c;我们就可以使用vector来使代码更加简洁 目录 1.vector的定义 2.在vector末尾增加一个元素 3.输出元素 &#xff08;1&#xff09;输出单个元素 &#xff08;2&#xff09;循环输出元素 4…...

pytorch查询字典、列表维度

输出tensor变量维度 print(a.shape)输出字典维度 for key, value in output_dict.items():if isinstance(value, torch.Tensor):print(f"{key} shape:", value.shape)输出列表维度 def get_list_dimensions(lst):# 基线条件&#xff1a;如果lst不是列表&#xff0…...

征程 6 VIO Frame 时间戳介绍

1. 时间类型 征程 6 内部的时间类型如下 Linux 系统时间是基于 arm system counter 抽象的&#xff0c;Linux 的基于 arm system counter 抽象了很多种时间&#xff0c;图中画了两种。CLOCK_MONOTONIC_RAW 是不会被时间同步调整的。 2. Frame 时间戳 从 VIO 侧获取的图像数…...

DotnetCore开源库SampleAdmin源码编译

1.报错: System.Net.Sockets.SocketException HResult0x80004005 Message由于目标计算机积极拒绝&#xff0c;无法连接。 SourceSystem.Net.Sockets StackTrace: 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, C…...

QML之ScrollView(滚动视图)

ScrollView 是 Qt Quick Controls 2 中提供的可滚动视图容器&#xff0c;用于创建可滚动区域。以下是详细使用方法&#xff1a; 基本用法 qml import QtQuick 2.15 import QtQuick.Controls 2.15ScrollView {id: scrollViewwidth: 300height: 200clip: true// 背景设置&…...

FreeRTOS使任务处于就绪状态的API

在FreeRTOS中,任务的**就绪状态(Ready State)**意味着任务已准备好运行,但尚未被调度器分配CPU时间。以下是通过API使任务进入就绪状态的常见方法及其分类: 1. 恢复被挂起的任务 vTaskResume(TaskHandle_t xTaskToResume) 将被挂起(Suspended)的任务恢复为就绪状态。 示…...

第四篇:Python文件操作与异常处理

第一章&#xff1a;文件操作基础与核心原理 1.1 文件系统基础 文件系统是操作系统用于管理存储设备中数据的核心机制。Python通过内置的open()函数实现文件操作&#xff0c;支持文本文件&#xff08;.txt、.csv&#xff09;和二进制文件&#xff08;.jpg、.dat&#xff09;的…...

蓝桥杯 嵌入式 小结

一、BSP模版 1. Key 按键扫描模版&#xff0c;需要注意的是 key_val 。 uint8_t Key_Scan(void) {uint8_t key_val0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)GPIO_PIN_RESET){key_val1;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)GPIO_PIN_RESET){key_val2;}if(HAL_GPIO_ReadPin(…...

【音视频】SDL渲染YUV格式像素

SDL视频显示的流程 实现流程 准备视频文件 准备一个格式为yuv420p&#xff0c;分辨率为320x240的yuv数据&#xff0c;并且将视频文件放入项目构建的目录下&#xff1a; 初始化SDL 初始化SDL的视频模块 //初始化 SDL if(SDL_Init(SDL_INIT_VIDEO)) {fprintf( stderr, "…...

ThingsBoard3.9.1 MQTT Topic(1)

1.网关转发子设备的遥测信息, Topic:v1/gateway/telemetry { "m1": [{ "mode": "CW", "temperature": 23 }], "m2": [{ "mode": "CW", "temperature": 23 }] } 说明&#xff1a;json格式&a…...

如何查看自己抖音的IP属地?详细教程+常见问题解答

在当今互联网时代&#xff0c;IP属地信息已成为各大社交平台&#xff08;如抖音、微博、快手等&#xff09;展示用户真实网络位置的重要功能。无论是出于隐私保护、账号安全&#xff0c;还是单纯好奇自己的IP归属地&#xff0c;了解如何查看抖音IP属地都很有必要。 本文将详细介…...

李宏毅NLP-2-语音识别part1

语音识别part1 这是一篇名为 “Speech Recognition is Difficult?”&#xff08;语音识别很难吗&#xff1f; &#xff09;的文章。作者是 J.R. Pierce&#xff0c;来自贝尔电话实验室&#xff08;Bell Telephone Laboratories, Inc.&#xff09; 。文中提到语音识别虽有吸引力…...

AUTOSAR图解==>AUTOSAR_SWS_MemoryMapping

AUTOSAR 内存映射机制详解 深入解析AUTOSAR标准中的内存映射技术 目录 AUTOSAR 内存映射机制详解 目录1. 概述2. 内存映射架构 2.1 架构组成2.2 映射类型2.3 关键组件3. 配置数据模型 3.1 主要配置容器3.2 内存段类型3.3 初始化策略4. 映射使用流程 4.1 配置阶段4.2 开发阶段...

探索 HTML5 新特性:提升网页开发的现代体验

在 Web 开发的演进历程中&#xff0c;HTML5 无疑是一座重要的里程碑。它不仅为网页带来了更丰富的功能&#xff0c;还提升了开发效率与用户体验。本文将深入探讨 HTML5 那些令人瞩目的新特性&#xff0c;助你紧跟现代 Web 开发潮流。 一、语义化标签&#xff1a;让结构更清晰 …...

系统设计思维的讨论

我们经常说自己熟悉了spring&#xff0c;能够搭建起一个项目基本框架&#xff0c;并且在此之上进行开发&#xff0c;用户or客户提出需求碰到不会的百度找找就可以实现。干个四五年下一份工作就去面试架构师了&#xff0c;运气好一些可能在中小公司真的找到一份架构师、技术负责…...

【音视频】SDL播放PCM音频

相关API 打开音频设备 int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, SDL_AudioSpec * obtained); desired&#xff1a;期望的参数。obtained&#xff1a;实际音频设备的参数&#xff0c;一般情况下设置为NULL即可。 SDL_AudioSpec typedef struct SDL_AudioSpec { i…...

FATFS文件系统配置

1、FatFs模块功能配置选项参考ffconf.h函数配置链接&#xff1a;FatFs模块功能配置选项 2、FATFS配置 FATFS 支持长文件名链接: FATFS&#xff1a;配置 FATFS 支持长文件名 3、 FATFS移植链接1 4、 FATFS移植链接2 5、FAT32 和 FATFS 是两个不同层次的概念&#xff0c;分别属于…...

JVM 字节码是如何存储信息的?

JVM 字节码是 Java 虚拟机 (JVM) 执行的指令集&#xff0c;它是一种与平台无关的二进制格式&#xff0c;在任何支持 JVM 的平台上都可运行的Java 程序。 字节码存储信息的方式&#xff0c;主要通过以下几个关键组成部分和机制来实现&#xff1a; 1. 指令 (Opcodes) 和 操作数 …...

Linux:多路转接(上)——select

目录 一、select接口 1.认识select系统调用 2.对各个参数的认识 二、编写select服务器 一、select接口 1.认识select系统调用 int select(int nfds, fd_set readfds, fd_set writefds, fd_set exceptfds, struct timeval* timeout); 头文件&#xff1a;sys/time.h、sys/ty…...

如何解决DDoS攻击问题 ?—专业解决方案深度分析

本文深入解析DDoS攻击面临的挑战与解决策略&#xff0c;提供了一系列防御技术和实践建议&#xff0c;帮助企业加强其网络安全架构&#xff0c;有效防御DDoS攻击。从攻击的识别、防范措施到应急响应&#xff0c;为网络安全工作者提供了详细的操作指引。 DDoS攻击概览&#xff1a…...

机器学习Python实战-第三章-分类问题-3.决策树算法

目录 3.3.1 原理简介 3.3.2 算法步骤 3.3.3 实战 3.3.4 实验 前半部分是理论介绍&#xff0c;后半部分是代码实践&#xff0c;可以选择性阅读。 决策树&#xff08;decision tree&#xff09;是功能强大而且相当受欢迎的分类和预估方法&…...

Spring三级缓存学习

Spring的三级缓存机制主要用于解决单例Bean的循环依赖问题。其核心在于提前暴露Bean的引用&#xff0c;允许未完全初始化的对象被其他Bean引用。以下是三级缓存的详细说明及其解决循环依赖的原理&#xff1a; 三级缓存结构 一级缓存&#xff08;singletonObjects&#xff09; 存…...

欧拉函数φ

函数作用 计算 1 1 1 ~ n n n中有多少个与 n n n互质的数。 函数公式 φ ( n ) n p 1 − 1 p 1 p 2 − 1 p 2 … … p m − 1 p m φ(n)n\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\times……\times\frac{p_m-1}{p_m} φ(n)np1​p1​−1​p2​p2​−1​……pm​p…...

蓝桥杯刷题指南

蓝桥杯是中国普及性最好的计算机程序设计竞赛之一&#xff0c;参加者包括大学生、高中生和草根程序员等各个群体。通过刷题来提升自己的编程能力是参加蓝桥杯比赛的常见做法。下面是一些蓝桥杯常见的题型和刷题技巧&#xff0c;希望对大家有所帮助。 基础入门题目&#xff1a;…...

ctfshow WEB web12

发现只有这样一句话&#xff0c;应该是要看页面源代码的&#xff0c;右键查看页面源代码 发现可能存在代码执行漏洞&#xff0c;拼接一个?cmdphpinfo(); 成功显示出php信息, 说明存在代码执行漏洞 接下来遍历目录&#xff0c;我们要用到一个函数 glob() glob() 函数可以查找…...

ChromeOS 135 版本更新

ChromeOS 135 版本更新 一、ChromeOS 135 更新内容 1. ChromeOS 电池寿命优化策略 为了延长 Chromebook 的使用寿命&#xff0c;ChromeOS 135 引入了一项全新的电池充电限制策略 —— DevicePowerBatteryChargingOptimization&#xff0c;可提供更多充电优化选项&#xff0c…...

redis的缓存

redis的缓存 一.缓存简介1.缓存2.redis作为数据库&#xff08;MySQL&#xff09;缓存的原因 二.缓存更新策略1.定期生成2.实时生成3.内存淘汰策略1&#xff09;FIFO(First In First Out) 先进先出2&#xff09;LRU(Least Recently Used)淘汰最久未使用的3&#xff09;LFU(Least…...

字符串与相应函数(上)

字符串处理函数分类 求字符串长度&#xff1a;strlen长度不受限制的字符串函数&#xff1a;strcpy,strcat,strcmp长度受限制的字符串函数:strncpy,strncat,strncmp字符串查找&#xff1a;strstr,strtok错误信息报告&#xff1a;strerror字符操作&#xff0c;内存操作函数&…...

【微知】Mellanox网卡网线插入后驱动的几个日志?(Cable plugged;IPv6 ... link becomes ready)

概要 本文是一个简单的信息记录。记录的是当服务器网卡的光模块插入后内核的日志打印。通过这种日志打印&#xff0c;可以在定位分析问题的时候&#xff0c;知道进行过一次模块插拔。 日志 截图版&#xff1a; 文字版&#xff1a; [32704.121294] mlx5_core 0000:01:00.0…...

spring security oauth2.0的四种模式

OAuth 2.0 定义了 4 种授权模式&#xff08;Grant Type&#xff09;&#xff0c;用于不同场景下的令牌获取。以下是每种模式的详细说明、适用场景和对比&#xff1a; 一、授权码模式&#xff08;Authorization Code Grant&#xff09; 适用场景 • Web 应用&#xff08;有后端…...