Skip to main content
Glama
king12q

ChemDraw Compound Smart Drawing MCP Tool

by king12q
README.md
# ChemDraw 化合物智能绘制 MCP 工具

一个集成化的 MCP (Model Context Protocol) 工具,能够从文档中智能识别化合物信息,通过 PubChem 等公开数据库验证和补充化合物数据,利用视觉识别技术解析化合物结构,最终调用本地 ChemDraw 软件绘制化合物结构并输出 ChemDraw 专用格式文件。

## ✨ 功能特性

- **文档化合物信息提取** - 支持 Word/PDF/Markdown/TXT 文档,中英文混合识别
- **PubChem 化合物数据查询** - 获取 SMILES、CAS 号、分子量、分子式等完整数据
- **视觉结构识别** - 从文档图片中识别化合物结构(基于 Imago 引擎)
- **ChemDraw COM 接口调用** - 自动化绘制化合物结构,支持 Clean Up 操作
- **多格式输出** - CDXML、CDX、PNG (300dpi)、SVG
- **学术规范设置** - Kekulé 苯环格式、20pt 字体、手性中心标记、统一键长角度

## 📋 系统要求

- **操作系统**: Windows 10/11
- **Python**: 3.8+
- **ChemDraw**: 2020/2021/2022(需已注册 COM 对象)
- **网络**: 可访问 PubChem API

## 🚀 安装

```bash
# 克隆仓库
git clone https://github.com/king12q/Chemdraw-draw-mcp.git
cd Chemdraw-draw-mcp

# 安装依赖
pip install -r requirements.txt
```

### 依赖库

| 库名 | 用途 |
|------|------|
| python-docx | Word 文档解析 |
| pdfplumber | PDF 文档解析 |
| pubchempy | PubChem API 调用 |
| pywin32 | ChemDraw COM 接口 |
| requests | HTTP 请求 |
| pillow | 图片处理 |
| opencv-python | 视觉识别图片预处理 |
| mcp | MCP 协议 SDK (FastMCP) |
| pytest | 测试框架 |

## 📖 使用方法

### MCP 工具调用

工具名称: `draw_compound`

**参数说明:**

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `input_type` | string | 是 | - | 输入类型: `document`/`name`/`smiles`/`image` |
| `input_value` | string | 是 | - | 输入值(文档路径/化合物名称/SMILES/图片路径) |
| `formats` | array | 否 | `["cdxml", "png"]` | 输出格式列表 |
| `benzene_format` | string | 否 | `"kekule"` | 苯环格式: `kekule`/`circle` |
| `font_size` | number | 否 | `20` | 字体大小 (pt) |
| `show_stereo` | boolean | 否 | `true` | 是否显示手性标记 |

**调用示例:**

```json
{
  "input_type": "name",
  "input_value": "Aspirin",
  "formats": ["cdxml", "png", "svg"],
  "benzene_format": "kekule",
  "font_size": 20,
  "show_stereo": true
}
```

### Python API 调用

```python
from src.mcp_server import draw_compound_handler

# 从化合物名称绘制
result = draw_compound_handler({
    "input_type": "name",
    "input_value": "Aspirin",
    "formats": ["cdxml", "png"]
})

# 从SMILES绘制
result = draw_compound_handler({
    "input_type": "smiles",
    "input_value": "CC(=O)OC1=CC=CC=C1C(=O)O"
})

# 从文档批量提取并绘制
result = draw_compound_handler({
    "input_type": "document",
    "input_value": "path/to/compounds.docx"
})
```

## 📁 项目结构

```
Chemdraw-draw-mcp/
├── src/
│   ├── parsers/              # 文档化合物信息提取模块
│   │   ├── word_parser.py
│   │   ├── pdf_parser.py
│   │   ├── markdown_parser.py
│   │   └── compound_identifier.py
│   ├── query/                # PubChem 化合物查询模块
│   │   └── pubchem_client.py
│   ├── visual/               # 视觉结构识别模块
│   │   ├── image_preprocessor.py
│   │   ├── structure_recognizer.py
│   │   ├── imago_recognizer.py
│   │   └── fallback_recognizer.py
│   ├── draw/                 # ChemDraw COM 接口模块
│   │   └── chemdraw_com.py
│   ├── output/               # 格式输出模块
│   │   └── format_exporter.py
│   ├── specs/                # 学术规范设置模块
│   │   └── academic_specs.py
│   └── mcp_server.py         # MCP 服务核心
├── tools/
│   └── draw_compound.json    # MCP 工具定义
├── tests/                    # 测试文件
├── requirements.txt
└── setup.py
```

## 🧪 测试

```bash
# 运行所有测试
pytest

# 运行特定模块测试
pytest tests/test_parsers.py
pytest tests/test_pubchem.py
pytest tests/test_chemdraw.py

# 运行集成测试
pytest tests/test_integration.py

# 运行性能测试
pytest tests/test_performance.py
```

## 📊 处理流程

```
输入 → 解析/查询 → 获取SMILES → ChemDraw绘制 → 学术规范应用 → 格式导出
```

1. **文档输入**: 解析 Word/PDF/Markdown → 识别化合物名称
2. **名称输入**: 查询 PubChem → 获取 SMILES
3. **SMILES输入**: 直接使用
4. **图片输入**: 视觉识别 → 获取 SMILES
5. **绘制**: 调用 ChemDraw COM → 绘制结构 → Clean Up
6. **规范**: Kekulé 格式 → 20pt 字体 → 手性标记
7. **输出**: CDXML/CDX/PNG/SVG

## 🔧 MCP 配置

在 TRAE IDE 中配置 MCP 服务(将路径替换为你的实际安装路径):

```json
{
  "mcpServers": {
    "chemdraw-draw": {
      "command": "python",
      "args": [
        "C:\\Users\\Administrator\\Desktop\\Review-Work\\Chemdraw-draw-mcp\\src\\mcp_server.py"
      ],
      "env": {}
    }
  }
}
```

> **注意**: `src/mcp_server.py` 已配置 `sys.path` 动态注入和绝对导入,可直接以脚本方式运行,无需额外设置 `PYTHONPATH`。

## 📝 返回数据格式

```json
{
  "success": true,
  "compounds": [
    {
      "name": "Aspirin",
      "chinese_name": "阿司匹林",
      "smiles": "CC(=O)OC1=CC=CC=C1C(=O)O",
      "cas": "50-78-2",
      "molecular_weight": 180.16,
      "formula": "C9H8O4"
    }
  ],
  "files": [
    "output/compound_1_Aspirin.cdxml",
    "output/compound_1_Aspirin.png"
  ],
  "message": "成功绘制 1 个化合物"
}
```

## ⚠️ 注意事项

- 确保 ChemDraw 已正确安装并注册 COM 对象
- 首次使用时 ChemDraw 可能会弹出安全提示,请允许程序访问
- PubChem 查询需要网络连接
- 输出文件默认保存在 `output/` 目录

## 📄 许可证

MIT License

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!