给个人程序加上MCP翅膀:用C# SDK把CAD/DWG能力接进TaoToken

发布时间:2026/10/2 6:46:28
给个人程序加上MCP翅膀:用C# SDK把CAD/DWG能力接进TaoToken 1. 个人 CAD 程序接入 MCP 的真实痛点与场景拆解个人开发者做 CAD/DWG 工具最尴尬的地方不是算法写不出来而是写出来之后没人帮你调用。你手里可能已经有一套能读写 DWG、能画多段线、能改颜色的 C# 程序但它只能靠鼠标点、靠按钮触发。想让 AI 客户端直接说一句“帮我打开这张图纸把选中的线改成红色”中间缺一层标准协议。MCPModel Context Protocol就是这层协议。它把本地程序的能力包装成“工具”让 Claude、Cursor、Cline 这类客户端通过统一的方式发现并调用。对个人开发者来说MCP 的价值在于你不需要为每个 AI 客户端单独写插件只要按协议暴露一次工具所有支持 MCP 的客户端都能用。我自己的场景很典型一个基于 C# 的自主 CAD 程序底层图形库是 C 封装的C# 层负责交互。之前想让 AI 帮忙操作图纸只能手动复制路径、手动执行命令。现在用 C# 官方 MCP SDK 把OpenDwgFile、DrawPolyline、DrawCircle、SetSelectedShapesColor这几个方法注册成 MCP 工具AI 客户端就能直接调用。但这里有个容易被忽略的环节MCP 客户端调用工具时很多场景需要模型推理比如根据自然语言决定调用哪个工具、传什么参数。如果你用的是云端模型就需要一个稳定的 API 通道。TaoToken 在这里的作用是统一 Key 和 Base URL让 C# MCP 服务端和 AI 客户端之间的模型调用走同一条通道不用每个客户端单独配一遍。这篇文章适合谁有 C# 基础、手里有 CAD/DWG 相关程序、想把本地能力暴露给 AI 客户端的个人开发者。不需要你懂 MCP 协议细节跟着步骤能跑通就行。核心检索词先明确C# MCP SDK 接入 CAD/DWG 能力通过 TaoToken 统一 API 通道。下面从项目结构开始一步步给出可复制的配置和代码。2. TaoToken 前置准备Base URL、API Key 与模型 ID 三件套在写 MCP 工具之前先把模型调用通道准备好。因为 MCP 客户端在调用工具时往往需要模型先做一轮推理决定调用哪个工具、参数怎么填。如果模型通道不稳定工具注册得再好也跑不起来。TaoToken 的接入信息就三样Base URL、API Key、Model ID。这三样在 MCP 客户端配置里会反复出现建议先记下来。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数直接填在客户端的base_url或OPENAI_BASE_URL字段里。API Key 在控制台的 API Keys 页面生成格式通常是一串以sk-开头的字符串。Model ID 根据你用的模型填比如claude-sonnet-4-20250514或gpt-4o这类。获取 Key 的入口在 TaoToken 控制台登录后进 API Keys 页面点创建复制出来。这个 Key 只显示一次丢了就重新建一个。模型对话的调试入口在模型对话页面可以先用它验证 Key 和 Base URL 是否通。发一条简单消息能返回就说明通道没问题。如果你后面要长期跑编码类 Agent比如让 AI 自动改 CAD 代码、自动生成工具注册逻辑可以看 Coding Plan 页面它针对长时间编码场景做了优化。接入文档在 doc 页面里面有各语言 SDK 的配置示例。C# 这边主要用 OpenAI 兼容的 HTTP 调用方式或者用官方 SDK 指定 Base URL。这里给一个 C# 里配置模型客户端的片段方便你在 MCP 服务端内部调用模型时用using OpenAI; var client new OpenAIClient( new System.ClientModel.ApiKeyCredential(你的TaoTokenKey), new OpenAIClientOptions { Endpoint new Uri(https://taotoken.net/api) });注意 Endpoint 只填到/api不要在后面加/v1或其他路径SDK 会自己拼接。如果你用的是其他 HTTP 客户端直接 POST 到https://taotoken.net/api/v1/chat/completionsHeader 里带Authorization: Bearer 你的Key。Model ID 的选择上工具调用场景建议用支持 function calling 的模型。Claude 系列和 GPT 系列都支持具体在模型对话页面能看到可用列表。三件套准备好之后再回到 MCP 服务端本身。MCP 服务端和模型调用是两条线MCP 负责把工具暴露给客户端模型负责推理。TaoToken 管的是模型这条线MCP 这条线走的是本地 stdio 或 SSE 传输。两者配合起来才是完整的“AI 操作 CAD”链路。3. C# MCP SDK 项目结构与可复制配置片段项目结构不用太复杂个人开发者一个类库加一个入口程序就够。我实测下来下面这个结构最省事CimEditor/ ├── CimEditor.csproj # 主程序含 MCP 服务启动入口 ├── Common/ │ └── CADServer.cs # MCP 工具注册类 ├── Graph/ # 你的 CAD 图形库封装 │ └── ... └── bin/ └── CimEditor.exe # 编译产物MCP 客户端指向它先装包。在项目目录下打开终端dotnet add package ModelContextProtocol --prerelease如果 NuGet 拉不下来换国内镜像。在项目根目录建NuGet.Config?xml version1.0 encodingutf-8? configuration packageSources clear / add keynuget.org valuehttps://api.nuget.org/v3/index.json / add keyhuawei valuehttps://repo.huaweicloud.com/repository/nuget/v3/index.json / /packageSources /configuration然后写 MCP 工具类。核心是用[McpServerToolType]标记类用[McpServerTool]标记方法参数用[Description]说明。下面是一个精简版只保留打开 DWG 和绘制多段线两个工具方便你先跑通using ModelContextProtocol.Server; 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 Project.Instance.Graph; graph.LoadDwg(filePath); return $DWG文件已成功打开: {filePath}; } catch (System.Exception ex) { return $打开DWG文件失败: {ex.Message}; } } [McpServerTool, Description(绘制多段线points格式为x1,y1;x2,y2;...)] public static string DrawPolyline( [Description(点坐标格式x1,y1;x2,y2;...)] string points, [Description(是否闭合)] bool isClosed) { try { var graph Project.Instance.Graph; 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}; } } } }然后在主程序入口启动 MCP 服务。用Host.CreateEmptyApplicationBuilder建一个空宿主注册 MCP 服务走 stdio 传输private void StartMcpServerInBackground() { Task.Run(async () { var builder Host.CreateEmptyApplicationBuilder(settings: null); builder.Services .AddMcpServer() .WithStdioServerTransport() .WithToolsFromAssembly(); await builder.Build().RunAsync(); }); }在Main或窗体加载时调用StartMcpServerInBackground()。注意 stdio 传输意味着 MCP 客户端会以子进程方式启动你的 exe通过标准输入输出通信。所以你的程序不能往控制台乱打印日志否则会污染协议数据。调试信息走文件日志。编译dotnet build -c Release产物在bin/Release/net8.0/CimEditor.exe。记住这个路径下一步配置客户端要用。这里有个坑如果你的 CAD 程序是 WinForms 或 WPF主线程被 UI 占用MCP 服务在后台 Task 里跑没问题但工具方法里操作图形对象时要注意线程安全。我试过直接在工具方法里改 UI 绑定的图形集合偶尔会抛跨线程异常。解决办法是在工具方法里用Dispatcher.Invoke或Control.Invoke包一层。个人项目图省事的话可以在工具方法开头加个锁或者把图形操作队列化。4. 客户端配置与 MCP Inspector 验证工具列表MCP 服务端跑起来之后先别急着接 AI 客户端用 MCP Inspector 验证工具列表最直接。Inspector 是官方提供的调试工具能列出所有注册的工具、参数 schema还能手动调用。安装 Inspectornpx modelcontextprotocol/inspector启动后浏览器打开http://localhost:5173在左侧选 stdioCommand 填你的 exe 路径Args 留空然后点 Connect。如果连接成功右侧会列出OpenDwgFile和DrawPolyline两个工具每个工具下面有参数说明。手动调用OpenDwgFilefilePath 填一个真实 DWG 路径点 Run。返回DWG文件已成功打开: ...就说明工具链路通了。这一步能排除掉 90% 的配置问题。接下来配 Cursor。在 Cursor 的 MCP 配置文件里加{ mcpServers: { DwgServer: { command: D:\\code\\cad\\cimediter\\bin\\CimEditor.exe, args: [], cwd: D:\\code\\cad\\cimediter\\bin, env: { DOTNET_ENVIRONMENT: Development } } } }注意command是 exe 的绝对路径cwd是工作目录。如果你的程序依赖同目录下的 DLL 或配置文件cwd必须设对否则会报找不到依赖。Cursor 里还需要配模型通道。在 Cursor 的模型设置里把 Base URL 填https://taotoken.net/apiAPI Key 填 TaoToken 的 KeyModel 填你选的模型 ID。这样 Cursor 在调用 MCP 工具时模型推理走 TaoToken 通道。如果你用的是 Cline 或 Claude Code配置方式类似。Cline 的 MCP 配置在设置里Claude Code 用claude mcp add命令。核心都是三件套exe 路径、Base URL、Key。Claude Code 的配置稍微特殊一点它用~/.claude.json或项目级.mcp.json。一个可复制的片段{ mcpServers: { DwgServer: { command: D:\\code\\cad\\cimediter\\bin\\CimEditor.exe, args: [], env: { DOTNET_ENVIRONMENT: Development } } } }Claude Code 的模型通道在~/.claude/settings.json里配指定ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。如果你用 TaoToken 的 Claude 通道Base URL 填https://taotoken.net/apiKey 填对应 Key。配置完之后重启客户端在对话里输入“列出可用的 MCP 工具”客户端应该能返回OpenDwgFile和DrawPolyline。这一步验证的是客户端到 MCP 服务端的发现链路。再进一步输入“打开 D:\test\demo.dwg”客户端会调用OpenDwgFile你的 CAD 程序里应该能看到图纸加载。如果没反应看客户端的 MCP 日志通常会有工具调用记录和返回结果。5. 常见报错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来。我踩过的坑基本都在这几个里。401 Unauthorized。这个最常见出现在模型调用环节。原因通常是 API Key 填错、Key 过期、或者 Base URL 多了/v1。检查三处客户端的 Key 字段、Base URL 是否严格是https://taotoken.net/api、Key 是否有空格。如果用的是环境变量确认变量名和代码里读的一致。C# 里读环境变量用Environment.GetEnvironmentVariable(TAOTOKEN_API_KEY)注意大小写。local proxy failed。这个报错通常出现在客户端尝试连接 MCP 服务端时。原因可能是 exe 路径不对、exe 没有执行权限、或者 exe 启动后立刻崩溃。排查方法在终端手动运行 exe看是否能正常启动。如果 exe 依赖 .NET 运行时确认目标机器装了对应版本。另外如果你的程序启动时会弹窗或需要用户交互MCP 客户端会卡住因为 stdio 传输要求程序静默启动。把启动逻辑改成无界面模式或者加个命令行参数判断。reading choices 相关报错。这个一般出现在模型返回格式不符合预期时。比如你让模型调用工具但模型返回了纯文本而不是 tool_calls。检查 Model ID 是否支持 function calling。有些轻量模型不支持工具调用换 Claude 或 GPT 系列。另外TaoToken 通道的响应格式是 OpenAI 兼容的如果你用的 SDK 期望 Anthropic 原生格式需要做适配。C# 这边建议统一用 OpenAI 兼容格式。OAuth 相关报错。如果你在 Claude Code 里看到 OAuth 报错通常是因为 Claude Code 默认走 Anthropic 官方 OAuth 流程而你配了自定义 Base URL。解决办法是在settings.json里显式指定ANTHROPIC_API_KEY并设置ANTHROPIC_BASE_URL。Claude Code 会优先用 API Key 而不是 OAuth。如果还是报错检查~/.claude.json里有没有残留的 OAuth token清掉再试。工具列表为空。MCP Inspector 连上了但工具列表是空的。原因通常是WithToolsFromAssembly()没找到标记了[McpServerToolType]的类。检查类是否是public static方法是否是public static以及类所在的程序集是否被正确加载。如果你的工具类在另一个类库里确保主程序引用了那个类库并且WithToolsFromAssembly能扫描到。调用工具时程序卡死。这个多半是线程问题。MCP 工具方法在后台线程执行如果你在里面操作 UI 线程的对象会死锁。解决办法是用Invoke切回 UI 线程或者把图形操作改成线程安全的队列。我自己的做法是在工具方法里只做数据准备把实际图形操作 post 到 UI 线程的消息队列然后等待完成信号。DWG 文件加载失败。如果OpenDwgFile返回“文件不存在”检查路径是否用了双反斜杠或正斜杠。C# 里字符串路径建议用D:\test\demo.dwg或D:/test/demo.dwg。如果返回其他异常看异常信息通常是 DWG 版本不兼容或图形库初始化失败。确保图形库在 MCP 服务启动前已经初始化。排查顺序建议先用 MCP Inspector 验证工具列表再用模型对话页面验证 Key 和 Base URL最后在客户端里联调。每一步单独验证比一上来就全链路调试快得多。6. 从工具注册到 AI 调用完整链路与后续扩展链路跑通之后你可以按同样的模式加更多工具。比如DrawCircle、DrawText、SetSelectedShapesColor代码结构和DrawPolyline一样只是参数不同。每加一个工具重新编译MCP 客户端重启后就能看到新工具。这里给一个SetSelectedShapesColor的片段展示如何操作选中图元[McpServerTool, Description(设置当前选中图元的颜色color格式为R,G,B)] public static string SetSelectedShapesColor( [Description(颜色格式R,G,B)] string color) { try { var graph 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 graph.GetSelectionCells(); int count 0; foreach (var cell in selected) { cell.Geometry.SetColor(new XDColor(r, g, b)); count; } return $已修改{count}个选中图元的颜色为({r},{g},{b}); } catch (System.Exception ex) { return $修改颜色失败: {ex.Message}; } }扩展方向有几个。一是加更多 CAD 操作比如偏移、修剪、标注。二是加查询类工具比如“列出所有图层”“统计图元数量”。三是把工具分组用不同的[McpServerToolType]类管理避免一个类太大。模型通道这边如果你要长期跑 Agent 任务比如让 AI 自动完成“打开图纸、识别墙体、批量改颜色”这种多步操作建议用 Coding Plan 的通道它在长上下文和工具调用稳定性上更好。验证模型是否正常可以用模型对话页面发一条带工具调用的测试消息。如果返回里包含 tool_calls 字段说明通道支持工具调用。接入文档在 doc 页面里面有各客户端的详细配置示例。API Keys 在 console 页面管理Key 泄露了及时删掉重建。最后说一个实用技巧MCP 工具方法的返回值尽量用字符串不要返回复杂对象。因为客户端展示工具结果时字符串最通用。如果确实需要返回结构化数据用 JSON 字符串并在 Description 里说明格式。这样 AI 客户端能正确解析你调试时也直观。整个链路的核心就三件事C# 里用官方 SDK 注册工具客户端里配好 exe 路径模型通道用 TaoToken 统一 Key 和 Base URL。三件事各自独立验证再联调基本不会卡住。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询