给个人程序加上MCP翅膀

背景

最近MCP这个词真是到处都是,看起来特别高大上。我平时没事的时候也一直在关注这方面的技术,知道它是怎么一回事,也懂该怎么去实现。但可惜一直抽不出时间来自己动手搞一个MCP服务。网上关于MCP的教程一搜一大把,但基本上都是些简单的Demo,而且大部分还是拿天气查询来做例子的,没什么新意,看多了都让人觉得无聊。

MCP服务器实现语言有pythonTypeScriptJavaC#Swift这几种语言,好家伙,就是没有C++,但是我大部分底层算法都是基于C++实现。基于此,我只能将我C++的程序封装成上述的语言,个人平时更多的还是封装成C#(之前实现的自主CAD程序已经可以在C#上调用),那就基于C#实现自己的MCP服务器吧。

基于MCP服务我想在自己的CAD程序中加入几个功能,分别是打开Dwg文件绘制图形修改颜色,画话不多说,直接上手。

C# 官方MCP 概述

在.NET 生态系统中,除了官方提供的 C# MCP SDK 外,还有一些其他与 MCP 相关的技术,比如 MCPSharp 和 mcpdotnet 等。这些工具也为开发者提供了丰富的功能和支持。MCPSharp 是一个专为.NET 设计的库,旨在帮助开发者轻松构建符合 Model Context Protocol(MCP)标准的服务器和客户端。它提供了创建合规工具和函数的功能,还支持连接现有的 MCP 服务器,甚至可以将.NET 方法直接暴露为 MCP 端点。而 mcpdotnet 则是一个基于.NET 的模型上下文协议(MCP)实现,能够让.NET 应用程序方便地与 MCP 客户端和服务器进行交互。
不过,相比于这些非官方的实现,C# 官方 MCP SDK 有着显著的优势,尤其是在标准化和兼容性方面。作为官方推出的工具,C# MCP SDK 严格遵循 MCP 协议标准,确保了不同应用程序和服务之间的交互既一致又可靠。而一些非官方实现可能在某些细节上与标准存在偏差,这可能会在集成过程中引发问题。例如,在与不同的 AI 模型集成时,官方 SDK 能够更准确地保证数据传输和工具调用的可靠性,从而减少因协议不一致而导致的错误。
此外,在兼容性方面,C# 官方 MCP SDK 经过了全面的测试和优化,能够与各种主流的.NET 框架和开发工具无缝协作。无论你使用的是最新版本的.NET,还是其他常用的开发工具,官方 SDK 都能轻松集成,为开发者省去不少麻烦。相比之下,其他相关技术在兼容性上可能会有一定的局限性,有时需要开发者额外花时间解决兼容性问题。因此,选择官方 SDK 不仅能让开发过程更加顺畅,还能提升项目的稳定性和效率。

MCP服务实战

编写C# MCP服务端
  1. 在个人的C#程序下打开终端,输入命令
## 如果安装不了,可能要给nuget更换国内镜像
dotnet add package ModelContextProtocol --prerelease
  1. 让cursor给我们编写mcp服务
@https://github.com/ModelContextProtocol/csharp-sdk 基于这份开源库说明,编写一个CADServer类,实现mcp服务,添加一个打开dwg文件的接口
using ModelContextProtocol.Server;
using mx;
using System.ComponentModel;
using System.IO;
using System.Linq;namespace CimEditor.Common
{[McpServerToolType]public static class CADServer{[McpServerTool, Description("打开指定路径的DWG文件,并返回是否成功")]public static string OpenDwgFile([Description("DWG文件的完整路径")] string filePath){if (!File.Exists(filePath)){return $"文件不存在: {filePath}";}try{var graph = CimEditor.Common.Project.Instance.Graph;graph.LoadDwg(filePath);return $"DWG文件已成功打开: {filePath}";}catch (System.Exception ex){return $"打开DWG文件失败: {ex.Message}";}}[McpServerTool, Description("绘制多段线,points格式为'x1,y1;x2,y2;...',isClosed表示是否闭合")]public static string DrawPolyline([Description("多段线点坐标,格式为'x1,y1;x2,y2;...' ")] string points,[Description("是否闭合")] bool isClosed){try{var graph = CimEditor.Common.Project.Instance.Graph;// 假设Graph有DrawPolyline方法,参数为点数组和是否闭合var pts = points.Split(';').Select(p => {var xy = p.Split(',');return new XDPoint(double.Parse(xy[0]),double.Parse(xy[1]));}).ToList();var polyline = XDPolylineShape.CreateObject();polyline.SetVertices(new XDPoints(pts));polyline.SetClosed(isClosed);graph.AddShape(polyline);return $"多段线已成功绘制,共{pts.Count}个点,闭合:{isClosed}";}catch (System.Exception ex){return $"绘制多段线失败: {ex.Message}";}}[McpServerTool, Description("绘制圆,center格式为'x,y',radius为半径")]public static string DrawCircle([Description("圆心坐标,格式为'x,y'")] string center,[Description("半径")] double radius){try{var graph = CimEditor.Common.Project.Instance.Graph;var xy = center.Split(',');double x = double.Parse(xy[0]);double y = double.Parse(xy[1]);var circle = XDCircleShape.CreateObject(new XDPoint(x, y), radius);graph.AddShape(circle);return $"圆已成功绘制,圆心:({x},{y}), 半径:{radius}";}catch (System.Exception ex){return $"绘制圆失败: {ex.Message}";}}[McpServerTool, Description("绘制文字,position格式为'x,y',text为内容,fontSize为字号")]public static string DrawText([Description("文字位置,格式为'x,y'")] string position,[Description("文字内容")] string text,[Description("字号")] double fontSize){try{var graph = CimEditor.Common.Project.Instance.Graph;var xy = position.Split(',');double x = double.Parse(xy[0]);double y = double.Parse(xy[1]);var text_shape = XDTextShape.CreateObject();text_shape.Position = new XDPoint(x, y);text_shape.TextSize = fontSize;return $"文字已成功绘制,位置:({x},{y}), 内容:'{text}', 字号:{fontSize}";}catch (System.Exception ex){return $"绘制文字失败: {ex.Message}";}}[McpServerTool, Description("设置当前选中图元的颜色,color格式为'R,G,B'")]public static string SetSelectedShapesColor([Description("颜色,格式为'R,G,B'")] string color){try{var graph = CimEditor.Common.Project.Instance.Graph;var rgb = color.Split(',');if (rgb.Length != 3)return "颜色格式错误,应为'R,G,B'";int r = int.Parse(rgb[0]);int g = int.Parse(rgb[1]);int b = int.Parse(rgb[2]);var selected_cells = graph.GetSelectionCells(); // 假设有此方法int count = 0;foreach (var cell in selected_cells){// 假设shape有SetColor方法,参数为r,g,bcell.Geometry.SetColor(new XDColor(r, g, b));count++;}return $"已成功修改{count}个选中图元的颜色为({r},{g},{b})";}catch (System.Exception ex){return $"修改颜色失败: {ex.Message}";}}}
} 
  1. 在程序主程入口添加
  private void StartMcpServerInBackground(){Task.Run(async () =>{var builder = Host.CreateEmptyApplicationBuilder(settings: null);builder.Services.AddMcpServer().WithStdioServerTransport().WithToolsFromAssembly();await builder.Build().RunAsync();});}
  1. 调整AI生成不合理的地方,编译通过即可。
使用Cursor配置mcp客户端。
{"mcpServers": {"DwgServer": {"command": "D:\\code\\cad\\cimediter\\bin\\CimEditor.exe","args": [],"cwd": "D:\\code\\cad\\cimediter\\bin","env": {"DOTNET_ENVIRONMENT": "Development"}}}
}

验证成果

mcp.mp4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/81537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS中国区CloudFront证书管理和应用指南

在AWS中国区使用CloudFront时,SSL/TLS证书的管理和应用是一个重要的环节。本文将详细介绍如何在AWS中国区上传、管理和应用SSL证书到CloudFront分配。 1. 准备证书文件 首先,我们需要准备好SSL证书相关的文件。通常,这包括: 私钥文件(.key)公钥证书文件(.crt)证书链文…

为什么hadoop不用Java的序列化?

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以&#xf…

Word压缩解决方案

Word压缩解决方案:基于图片压缩的 .docx 优化实践 📌 背景 在日常科研写作或项目文档整理中,Word 文档(.docx)往往因为插入大量高清图表、扫描图像、公式图等导致文件体积过大,或者毕业学位论文查重要求上…

基于基金净值百分位的交易策略

策略来源:睿思量化小程序 基金净值百分位,是衡量当前基金净值在过去一段时间内的相对位置。以近一年为例,若某基金净值百分位为30%,意味着过去一年中有30%的时间基金净值低于当前值,70%的时间高于当前值。这一指标犹如…

数字人技术的核心:AI与动作捕捉的双引擎驱动(210)

**摘要:**数字人技术从静态建模迈向动态交互,AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈,但通过多模态融合技术、轻量化动捕方案等创新,数字人正逐步实现自然交互与情感表达。…

基于OpenCV的实时文档扫描与矫正技术

文章目录 引言一、系统概述二、核心代码解析1. 导入必要库2. 辅助函数定义3. 坐标点排序函数4. 透视变换函数5. 主程序流程 三、完整代码四、结语 引言 在日常工作和学习中,我们经常需要将纸质文档数字化。手动拍摄文档照片常常会出现角度倾斜、透视变形等问题&…

jenkins pipeline实现CI/CD

在企业级的架构中,CI/CD是必不可少的一个环节,它可以让开发人员只关注于开发,而不必去关注项目的构建和部署,从而提高开发人员的效率。 本文我们来介绍一下使用jenkins 的pipeline来进行java项目的自动构建以及部署。我们通过脚本…

InfluxDB 3 Core + Java 11 + Spring Boot:打造高效物联网数据平台

一、 引言:为什么选择InfluxDB 3? 项目背景: 在我们的隧道风机监控系统中,实时数据的采集、存储和高效查询是至关重要的核心需求。风机运行产生的振动、倾角、电流、温度等参数是典型的时序数据,具有高并发写入、数据…

泰国SAP ERP实施如何应对挑战?工博科技赋能中企出海EEC战略

泰国正依托"东部经济走廊(EEC)"与RCEP协定叠加优势,为中国企业提供面向亚太市场的战略机遇。作为2022年泰国主要外资来源国之一,中国企业通过电子制造、智能家电、数据中心及新能源车等领域的投资深度参与泰国"4.0…

【设计模式】- 创建者模式

单例模型 饿汉式 静态方法创建对象 public class Singleton {// 私有构造方法private Singleton(){}private static Singleton instance new Singleton();// 提供一个外界获取的方法public static Singleton getInstance(){return instance;} }静态代码块创建对象 public …

逻辑与非逻辑的弥聚

非逻辑弥聚与逻辑弥聚是复杂系统中两种不同的信息整合方式。逻辑弥聚侧重于通过明确的规则、规律和结构化方法,将分散的信息或功能进行有序的组织和集中处理,强调理性和确定性。而非逻辑弥聚则更多地涉及情感、直觉、经验等非线性、非结构化的因素&#…

Linux进程信号(三)之信号产生2

文章目录 4. 由软件条件产生信号5. 硬件异常产生信号模拟一下除0错误和野指针异常除0错误野指针错误 总结思考一下 4. 由软件条件产生信号 SIGPIPE是一种由软件条件产生的信号,在“管道”中已经介绍过了。 软件条件不就绪,很明显这个软件条件没有直接报错&#xff…

读取18B20的问题,时钟太慢了

使用MSP430,1M时钟,在读取18B20数据时,一直存在问题,使用逻辑分析仪读取的数据也是莫名其妙,查看电路图和器件也没有发现问题,就这样断断续续的卡了一周多。 今天忽然想把时钟升一下试试,原来1…

第12章 Java多线程机制

12.1 进程与线程 4种状态:新建、运行、中断和死亡。 (新建、运行、中断和死亡) 建立线程的两种方法:用Thread类或其子类。 线程新建后,必须调用 start () 方法使其进入就绪队列,才有机会获得 CPU 资源&a…

利用 Amazon Bedrock Data Automation(BDA)对视频数据进行自动化处理与检索

当前点播视频平台搜索功能主要是基于视频标题的关键字检索。对于点播平台而言,我们希望可以通过优化视频搜索体验满足用户通过模糊描述查找视频的需求,从而提高用户的搜索体验。借助 Amazon Bedrock Data Automation(BDA)技术&…

React 19版本refs也支持清理函数了。

文章目录 前言一、refs 支持清理函数二、案例演示1.useEffect写法2.React 19改进 的ref写法 总结 前言 React 19版本发布了ref支持清理函数了,这样就可以达到useEffect一样的效果了。为啥需要清理函数呢,这是因为节约内存。 清理事件监听(避…

城市内涝监测预警系统守护城市安全

一、系统背景 城市内涝是指由于强降水或连续性降水超过城市排水能力,导致城市内产生积水灾害的现象。随着气候变化和城市化进程的加快,城市内涝现象愈发频繁和严重。传统的城市排水系统已难以满足当前的城市排水需求,特别是在暴雨等极端天气条…

Flink 作业提交流程

Apache Flink 的 作业提交流程(Job Submission Process) 是指从用户编写完 Flink 应用程序,到最终在 Flink 集群上运行并执行任务的整个过程。它涉及多个组件之间的交互,包括客户端、JobManager、TaskManager 和 ResourceManager。…

ctr查看镜像

# 拉取镜像到 k8s.io 命名空间 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 验证镜像是否已下载 sudo nerdctl --namespace k8s.io images 下载镜像到k8s.io名称空间下 nerdctl --namespace k8s.io pull zookeeper:3.6.2 sudo ctr image pull --namespace k8s.io …

中科院自动化研究所通用空中任务无人机!基于大模型的通用任务执行与自主飞行

作者: Ji Zhao and Xiao Lin 单位:中科院自动化研究所 论文标题:General-Purpose Aerial Intelligent Agents Empowered by Large Language Models 论文链接:https://arxiv.org/pdf/2503.08302 主要贡献 硬件-软件协同设计框…