Skip to main content
Glama
README.md
# dxf-cad-mcp

轻量级 **DXF CAD MCP 服务器**:让任何 AI agent(Claude / dsh / Cursor …)通过 MCP 协议
画工程图,不依赖 CAD 图形界面。

```
创建 DXF → 绘制实体/标注/填充/图块 → 图层管理 → 检查图纸
        → PNG 预览 / 矢量 PDF 导出 → 一键打开到 CAD
```

- **跨平台**:macOS / Windows / Linux 均可运行(DXF 是 Autodesk 公开规范的交换格式)
- **纯本地**:ezdxf + matplotlib,不需要网络,不需要 CAD 授权即可生成图纸
- **macOS + AutoCAD 友好**:内置中文字体(.ttc)与 "白/黑" 双色(ACI 7)渲染修复

## 为什么走 DXF 路线

- AutoCAD for Mac **没有** AppleScript / COM / .NET 接口,直接操控 UI 不可行
  (Windows 上的 CAD MCP 项目大多依赖 COM,难以移植)
- DXF 是公开交换格式:ezdxf 纯本地读写,生成的图纸任何 CAD 软件都能打开
  (AutoCAD / LibreCAD / QCAD / FreeCAD …)
- **"以文件为中心"** 的架构:稳定、可验证、可回放——PNG/PDF 预览与 CAD 终显互相对照

## 特性

- 11 个 MCP 工具,覆盖完整 2D 绘图工作流(见下表)
- 9 种基础实体 + 5 种尺寸标注 + 27 种标准填充图案 + 样条 + 图块
- 颜色三种写法:ACI 数字 / 颜色名(`"red"`)/ `#RRGGBB` 真彩色
- 内置标准线型:Dashed / Center / Hidden / Phantom / Dashdot
- PNG 预览 + 矢量 PDF 导出(auto 自适应或 A4/A3/A2 横版)
- 中文渲染:启动时自动注册系统 CJK 字体,中文标注/文字预览不空白

## 工具列表(11 个)

| 工具 | 说明 |
|------|------|
| `dxf_create` | 创建空 DXF(版本 R12~R2018,默认 R2010) |
| `dxf_draw` | 追加实体:line / polyline / rectangle / circle / arc / ellipse / point / text / mtext;文件不存在自动创建,引用的图层自动创建 |
| `dxf_dimensions` | 追加尺寸标注:linear / aligned / radius / diameter / angular;返回每个标注的实测值 |
| `dxf_hatch` | 追加填充:solid 实底 / ANSI31 等标准图案;闭合多边形边界 |
| `dxf_splines` | 追加样条线(过拟合点集的 2/3 阶样条) |
| `dxf_blocks` | 定义图块(内含 `dxf_draw` 同款实体)并插入引用(旋转/缩放) |
| `dxf_layers` | 创建/更新图层(颜色:ACI 数字 / 颜色名 / #RRGGBB;线型:Continuous/Dashed/Center/Hidden/Phantom/Dashdot) |
| `dxf_read` | 检查图纸:版本、实体统计、类型分布、包围盒、图层 |
| `dxf_render` | 渲染 PNG 预览(ezdxf + matplotlib,不需要打开 CAD) |
| `dxf_export_pdf` | 导出矢量 PDF(线条/文字保持矢量,可 auto 自适应或 A4/A3/A2 横版) |
| `dxf_open_in_autocad` | 用 macOS `open` 打开到本机 AutoCAD(自动找 /Applications/Autodesk 下的实例,完整版优先) |

## 快速开始

```bash
git clone <repo-url> dxf-cad-mcp && cd dxf-cad-mcp
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt     # mcp<2, ezdxf, matplotlib
```

或者直接作为包安装(附带 `dxf-cad-mcp` 命令):

```bash
pip install .        # 或 pipx install .
```

**不经 MCP 先试一把**(生成一张带标注/填充/图块的示例图):

```bash
.venv/bin/python examples/quickstart.py
# 输出 examples/quickstart.dxf / .png / .pdf
```

## 接入 MCP 客户端

服务器使用 **stdio** 传输,在任何支持 MCP 的客户端里配置命令行即可。

dsh(`~/.dsh/profiles/web/cordis.patch.yml`):

```yaml
- insert:
    - id: mcp-dxf-cad
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: dxf-cad
        transport: stdio
        command: /path/to/dxf-cad-mcp/.venv/bin/python
        args: ['/path/to/dxf-cad-mcp/server.py']
        cwd: /path/to/dxf-cad-mcp
        toolCallTimeoutMs: 120000
```

通用 MCP 客户端(Claude Desktop / Cursor 等):

```json
{
  "mcpServers": {
    "dxf-cad": {
      "command": "/path/to/dxf-cad-mcp/.venv/bin/python",
      "args": ["/path/to/dxf-cad-mcp/server.py"]
    }
  }
}
```

## 测试

```bash
.venv/bin/python test_client.py    # 端到端(第一批):基础实体 + 渲染
.venv/bin/python test_client2.py   # 端到端(第二批):标注/填充/样条/图块 + PDF
```

测试产物输出到 `test_output/`(已 gitignore)。

## 已知限制

- 仅 2D:无参数化实体/约束/动态块(DXF 格式本身不含这些数据)
- DXF 写入版本最高 R2018(AC1032),AutoCAD 2018+ 均可读取
- 标注预览使用 ezdxf 简化渲染器,与 CAD 显示可能有差异(AutoCAD 打开时按
  定义点重新渲染,**以 CAD 显示为准**)
- 填充边界仅支持闭合多边形(圆形/弧线边界暂不支持)
- 仅 model space;布局/图纸空间未实现
- `dxf_open_in_autocad` 仅 macOS(依赖 `open` 命令)
- mcp SDK 固定 `<2`:2.x 把 FastMCP 改名 MCPServer,与 v1 客户端生态不兼容

## 项目结构

```
dxf-cad-mcp/
├── server.py            # MCP 服务器(11 个工具)
├── examples/
│   └── quickstart.py    # 直调示例(无需 MCP 协议)
├── test_client.py       # 端到端测试(第一批)
├── test_client2.py      # 端到端测试(第二批)
├── requirements.txt
├── pyproject.toml
├── LICENSE              # MIT
└── README.md
```

## License

[MIT](./LICENSE)