一份代码三端跑:solidcraft 如何把桌面、浏览器与 MCP 服务器塞进同一 Rust 仓库
一份代码三端跑solidcraft 如何把桌面、浏览器与 MCP 服务器塞进同一 Rust 仓库【免费下载链接】solidcraftSolidCraft: an open-source parametric 3D CAD application built in pure Rust. Desktop, web, and automation through MCP.项目地址: https://gitcode.com/gh_mirrors/so/solidcraft在 CAD 这个被 Autodesk Fusion、SolidWorks 们把持了数十年的领域开源替代品长期停留在能看不能建的 Viewer 阶段。solidcraft当前工作区版本 0.8.0则走出了一条不同的路一个用纯 Rust 编写的参数化 3D CAD不仅同时发布 Windows / macOS / Linux 桌面安装包和浏览器在线版还把建模能力以 MCPModel Context Protocol协议直接开放给 AI 智能体——而支撑这三端的是同一个 Cargo 工作区、同一套几何内核、同一份界面代码。本文从仓库源码出发拆解它如何用命令注册表 可换前端的架构把桌面、浏览器和 Agent 自动化塞进同一份代码并讨论这套架构对后来者的启示。一张命令注册表五个入口要理解 solidcraft 的三端共享首先要看它最核心的架构决策一切用户可见的操作都是命令command。在 crates/engine/src/cmd/mod.rs 中每个命令被定义为一个CommandSpec带有稳定的小写点分式 id例如solid.extrude、sketch.create、solid.fillet、timeline.rollbackCommandSpec::new(solid.fillet, Fillet, fillet) .at(SOLID, MODIFY) // toolbar tab and panel ( not on the toolbar) .icon(fillet) // drawn in code, crates/ui-egui/src/icons.rs .key(F) // default shortcut .params(edges: [[x,y,z] | {body, index}]; radius: expr; …),命令的执行函数签名是fn(mut Session, Value) - ResultValue接收 JSON 参数、返回 JSON 结果并且永远不弹对话框。这意味着工具栏、命令面板、脚本、CLI、控制通道和 MCP 都只是同一扇门的不同入口——它们全部汇入Session::execute(id, params)见 crates/engine/src/lib.rs。docs/features.md 记录了当前注册表规模322 条命令覆盖草图98 条、特征、装配、钣金等全部建模动作。这条设计带来的直接收益是为人类用户做的每一个功能自动变成了可供脚本和 AI 调用的 API。screenshot、文档检查、参数修改等辅助能力也是命令整棵功能树因此天然具备可编程性而不是像传统 CAD 那样事后补一套 SDK。严格分层的 Cargo 工作区三端能共享代码还取决于仓库的分层约束。根目录的 Cargo.toml 以 workspace 方式组织成员为crates/*、apps/*和xtaskdocs/book/src/dev/architecture.md 明确规定了规则下层 crate 不能依赖上层 crate并有cargo xtask layers在构建时强制校验违反即构建失败。几何与内核crates/geom、crates/sketch、crates/kernel负责曲线、草图求解与 B-rep 布尔运算。只有crates/kernel允许触碰 truck 系列第三方几何库其上层看到的都是 SolidCraft 自己的类型。文档与引擎crates/doc持有参数表、特征时间线和组件树并求值为模型crates/engine是命令注册表所在层UI 之上的一切CLI、MCP、控制通道都跑在它的Session上。可换前端crates/ui-egui是唯一的界面层但没有任何下层 crate 依赖 egui。前端只是一层薄壳面板读引擎状态、动作通过命令发出SolveApp本身不持有任何设计数据。渲染解耦crates/render/src/lib.rs 除了 GPU 视口用的相机数学还内置了一个纯 CPU 的软件光栅化器z-buffer、平滑着色三角形、深度测试线段用于没有 GPU 也要出图的场景——这正是无头模式的截图基础。这个分层意味着只要ui-egui能被替换同一个引擎就可以同时支撑桌面原生窗口、浏览器 wasm 和无窗口的 MCP 服务器。桌面端eframe 外壳 本地控制通道桌面入口 apps/solidcraft/src/main.rs 基于 eframe/egui-wgpu 构建自定义标题栏、24 位深度缓冲 8 位模板缓冲、可配置 MSAA1/2/4/8 倍、崩溃报告backtrace 携带 file:line、SpaceMouse 支持仅 Windows/Linux等。值得注意的不是这些常规桌面能力而是--control port参数它启动一个绑定127.0.0.1的循环回 JSON-lines 控制服务器apps/solidcraft/src/control_server.rs每行一个请求{id:1,method:engine.execute,params:{...}}每行一个应答。由于它把真实指针和键盘事件注入 egui外部进程不仅能执行命令还能模拟点击、拖拽、菜单选择——即完整地操作真人会操作的界面。代码对这条通道做了严格的防御设计单行请求上限 16 MiB与 MCP 服务器共用同一常量MAX_LINE见 crates/engine/src/lib.rs单行超限直接拒绝连续 8 行非法 JSON 即断开最多同时服务 16 个连接UI 线程每帧最多处理 64 个排队请求防止洪泛饿死渲染60 秒未应答则超时。控制协议全貌记录在 docs/control-protocol.md。浏览器端同一份 SolveApp 编译成 wasmWeb 入口 apps/solidcraft-web/src/main.rs 的注释说得很直白Runs the same [solidcraft_ui_egui::SolveApp] as the desktop app through eframes web runner。桌面端和 Web 端都调用SolveApp::new(Session::default(), services)差异只在Services注入的文件对话框实现不同——桌面用rfd系统对话框浏览器用 OPFS 文件面板。浏览器端有几个值得借鉴的工程细节渲染降级wgpu 优先走 WebGPU不支持时回退 WebGL2URL 加?webgl可强制apps/solidcraft-web/index.html 中加载页在启动失败时明确提示需要支持 WebGPU 或 WebGL2 的浏览器。文件系统apps/solidcraft-web/src/files.rs 把设计文件持久化到浏览器的 OPFSOrigin Private File System导入的文件进入引擎的内存 VFS没有 OPFS 时降级到 localStorage。未保存的设计每 30 秒自动快照一次页面关闭时通过beforeunload拦截刷新后弹出Recover unsaved work?恢复对话框——把桌面端的崩溃恢复体验平移到了浏览器。按需字体CJK 字体BIZUDPGothic-Regular.ttf只在切换到日文界面时才异步拉取避免默认体积膨胀。构建则由 Trunk 负责apps/solidcraft-web/Trunk.toml 指定trunk build --release输出到dist/web。一个关键细节是工作区里web-time依赖的注释——在 wasm32 目标上std::time::Instant会 panic所以时间获取统一走兼容层这正是把浏览器当一等公民而非事后移植的证明。MCP为什么不写插件 APIsolidcraft 的自动化入口没有选择自定义插件 API而是直接实现了MCP 服务器crates/mcp/src/lib.rsJSON-RPC 2.0 over stdio换行分隔消息完整实现 MCP 生命周期initialize / notifications/initialized / ping、tools、resources 与错误码协议版本 2025-06-18并向后兼容 2025-03-26 与 2024-11-05。真正精巧的是 crates/mcp/src/backend.rs 的Backendtrait——MCP 工具只是控制通道方法的薄封装而控制通道方法由两种后端提供服务Headless进程内的无窗口Session不依赖任何 UI截图走 CPU 光栅化ui.render这就是solidcraft-cli mcp的默认模式。Remote通过--connect 127.0.0.1:PORT桥接到一个正在运行的桌面 AppAI 建模时真人可以看着视口ui.screenshot直接截取真实窗口。于是 MCP 工具集execute、batch、inspect_design、measure、body_topology、set_parameter、screenshot、export、undo、crash_reports等见 docs/mcp.md没有一行建模逻辑——所有建模逻辑都住在 322 条引擎命令里。batch工具甚至实现了事务语义出错时回滚到执行前的引擎检查点edit.checkpoint设计、活动草图和撤销历史精确恢复且每步{command, params}失败即停。选 MCP 而非插件 API的理性依据在这个仓库里看得非常清楚既然命令已经以 JSON 进出、引擎已经无头可跑那么自动化协议就只是传输层选择。接入 MCP 意味着直接获得 Claude Code、Claude Desktop 等整个 Agent 生态的即插即用能力docs/mcp.md 给出了两者的配置示例而不用维护一套仅限本项目的插件 SDK代价协议版本演进、batch 上限等则集中在 crates/mcp/src/server.rs 一个文件内。AI 建模与真人操作走的是完全相同的代码路径——智能体甚至能通过ui.click、ui.drag这类控制通道方法替真人点按钮仓库里还专门实现了agent cursorcrates/ui-egui/src/agent_cursor.rs让 AI 的鼠标在屏幕上滑动到目标再操作整个过程可被录制观赏。一个可复现的自动化实例仓库用一段可复现的演示验证了这条链路examples/demo/enclosure_mcp.py 是一个最小 MCP 客户端通过solidcraft-cli mcp --connect桥接运行中的 App按 examples/demo/enclosure_steps.json 的步骤一步步构建电子产品外壳圆角盒体、顶部开口抽壳、侧壁 USB 口切除、四个螺丝座最后修改width参数让时间线整体重建。另一版 examples/demo/enclosure_ui_mcp.py 干脆走 UI 路线——指针滑动到工具栏按钮和模型面并点击真实对话框打开草图落在模型面上相机跟随参数与两次拉伸仍走 MCP。docs/mcp.md 还记录了一段完整的 JSON-RPC 会话从initialize到一次batch草图→矩形→完成→拉伸 20→圆角 3→打孔再到measure拿到volume_mm3: 22390.6最后screenshot返回 PNG 图片内容块——这基本就是AI 设计-验证-出图的最小闭环。质量侧README 披露的 oracle 数据76 个公开基准件中 75 个与解析计算或 FreeCAD 的体量/面积/质心/包围盒一致为 Agent 反复试错提供了可依赖的地基。对后来者的架构启示读完这个仓库能提炼出几条对用 Rust 做全栈 CAD 或类似重型桌面软件的启示以命令为唯一事实源。把每个用户动作固化为带 id、带 JSON 参数、可撤销、可注册的命令UI、脚本、CLI、自动化协议自动获得同一能力面。这是三端共享的根基比任何统一 API 层都更彻底。无头优先headless-first。渲染与窗口不是引擎的一部分——crates/render提供 CPU 光栅化Session可以在没有窗口的进程里完整建模、测量、导出、截图。这让 CLI、CI、模糊测试仓库自带solidcraft-cli fuzz和 AI Agent 全部白嫖同一条主线。前端可换且换得便宜。ui-egui不持有数据、一切经命令桌面与 Web 因此共享SolveAppServices把打开/保存文件这类平台差异收口成可注入的回调。后端服务项目可借鉴平台服务注入而非平台条件编译满天飞。协议选择交给生态。在命令层已经 JSON 化的前提下MCP 只是传输层选择生态标准协议而不是自造插件 API让 Agent 客户端零适配接入还能随协议演进三个版本号并存平滑升级。把 wasm 当一等公民。从时间 APIweb-time到文件存储OPFS 降级链再到字体按需加载浏览器端不是桌面的缩略版而是有独立体验设计的完整产品——只是复用同一套内核与界面。当然也要看到代价forbid(unsafe_code)与deny(clippy::unwrap_used)等近乎偏执的 lint 贯穿所有 crate三端共享意味着最薄弱的目标wasm约束着全局浏览器端仍受 WebGPU/WebGL2 门槛限制几何内核边界只有 kernel 碰 truck也换来了上层的类型自洽与下层的可控风险。但 solidcraft 证明了一件事参数化 CAD 的桌面 浏览器 Agent不是三个产品而是一个命令注册表、一个分层 workspace、和一个开放的传输层。对于想用 Rust 切入重工业软件的团队这份仓库本身就是一份可读的架构说明书。【免费下载链接】solidcraftSolidCraft: an open-source parametric 3D CAD application built in pure Rust. Desktop, web, and automation through MCP.项目地址: https://gitcode.com/gh_mirrors/so/solidcraft创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考