給個人程序加上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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81537.shtml
英文地址,請注明出處:http://en.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 主要貢獻 硬件-軟件協同設計框…