# ComfyUI MCP 服务器
这是一个 Model Context Protocol (MCP) 服务器,用于动态加载和执行 ComfyUI 工作流。它会自动扫描指定文件夹中的工作流,并将每个工作流作为独立的工具暴露给大模型。
## 功能特点
- 动态加载 ComfyUI 工作流文件夹
- 基于描述文件的参数映射系统
- 通过 WebSocket 监听工作流执行进度
- 支持 WSL2 环境(自动绕过代理)
- 灵活的参数配置和默认值
- 支持自定义输出目录
## 快速开始
### 1. 安装和构建
```bash
# 克隆或进入项目目录
cd comfyui-mcp
# 安装依赖
npm install
# 构建项目
npm run build
# 记录当前目录的绝对路径(后续配置需要)
pwd # 例如:/home/username/comfyui-mcp
```
### 2. 配置环境
#### WSL2 用户:检测 Windows 主机 IP
```bash
bash scripts/detect-wsl2-host.sh
```
#### 创建配置文件
```bash
cp .env.example .env
```
编辑 `.env` 文件:
```env
# ComfyUI 工作流文件夹路径
WORKFLOWS_DIR=./workflows
# ComfyUI 服务器配置
COMFYUI_HOST=172.22.240.1 # WSL2 中的 Windows 主机 IP
COMFYUI_PORT=8000
# 绕过系统代理(WSL2 环境建议开启)
BYPASS_PROXY=true
```
### 3. 测试连接
```bash
node test-connection.js
```
### 4. 在 Claude Desktop 中配置
编辑 Claude Desktop 配置文件:
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
添加 MCP 服务器配置(使用绝对路径):
```json
{
"mcpServers": {
"comfyui": {
"command": "npx",
"args": ["/absolute/path/to/comfyui-mcp"],
"env": {
"WORKFLOWS_DIR": "/absolute/path/to/comfyui-mcp/workflows",
"COMFYUI_HOST": "172.22.240.1",
"COMFYUI_PORT": "8000",
"BYPASS_PROXY": "true"
}
}
}
}
```
**示例配置(WSL2)**:
```json
{
"mcpServers": {
"comfyui": {
"command": "npx",
"args": ["/home/yarnb/xcan/comfyui-mcp"],
"env": {
"WORKFLOWS_DIR": "/home/yarnb/xcan/comfyui-mcp/workflows",
"COMFYUI_HOST": "172.22.240.1",
"COMFYUI_PORT": "8000",
"BYPASS_PROXY": "true"
}
}
}
}
```
**注意事项**:
- `WORKFLOWS_DIR` 必须是绝对路径
- `COMFYUI_HOST` 使用检测脚本获取的 IP
- 配置后需要重启 Claude Desktop
### 5. 验证安装
重启 Claude Desktop 后,在对话中输入:
```
使用 Qwen 模型生成一张中国山水画
```
Claude 会自动识别并调用对应的工具。
### 6. 使用自定义输出目录
所有工具都支持指定输出目录参数:
```
使用 run_text_to_image_workflow_flux_schnell 工具生成图片,
prompt: "beautiful sunset",
output_dir: "/home/username/my_images"
```
如果不指定 `output_dir`,文件将保存到默认的 `outputs` 目录。
## 工作流组织结构
工作流按照功能分类组织,每个工作流都在独立的文件夹中:
```
workflows/
├── text-to-image/ # 文本生成图像
│ └── image_qwen_image/ # Qwen 视觉语言模型
├── image-to-image/ # 图像转图像/编辑
│ ├── omnigen2_image_edit/ # OmniGen2 智能编辑
│ ├── qwen_image_edit/ # Qwen 图像编辑
│ ├── qwen_image_controlnet_patch/ # Qwen + ControlNet Patch
│ ├── qwen_image_instantx_controlnet/ # Qwen + InstantX ControlNet
│ ├── qwen_image_union_control/ # Qwen + Union Control
│ ├── rmbg_multiple_models/ # 多模型背景移除
│ └── yolo_cropper/ # YOLO 智能裁剪
├── image-to-video/ # 图像生成视频
│ ├── wan2_2_14b_i2v/ # WAN 2.2 14B 图生视频
│ └── wan2_2_14b_flf2v/ # WAN 2.2 14B 首尾帧插值
├── text-to-video/ # 文本生成视频
│ └── wan2_2_14b_t2v/ # WAN 2.2 14B 文生视频
├── text-to-audio/ # 文本生成音频
│ ├── audio_ace_step_1_t2a_instrumentals/ # ACE 纯器乐生成
│ └── audio_ace_step_1_t2a_song/ # ACE 带歌词音乐生成
└── audio-to-audio/ # 音频编辑
└── audio_ace_step_1_a2a_editing/ # ACE 音频编辑
每个工作流文件夹包含:
├── workflow.json # ComfyUI 导出的工作流 JSON(统一命名)
├── descriptor.json # 参数描述文件(包含分类信息)
└── README.md # 工作流详细说明(可选)
```
### 描述文件格式
`descriptor.json` 定义了工作流的参数及其在 JSON 中的路径:
```json
{
"description": "工作流的描述",
"parameters": [
{
"name": "prompt", // 参数名称
"type": "string", // 参数类型(string/number/boolean)
"subtype": "image", // 子类型(可选,用于标识特殊参数如图片)
"description": "描述词", // 参数说明
"required": true, // 是否必需
"path": "6.inputs.text", // JSON 路径
"default": "默认值" // 默认值(可选)
}
]
}
```
### 参数路径说明
`path` 字段使用点号分隔的路径来定位 JSON 中的值:
- `"6.inputs.text"` 对应 `workflow[6].inputs.text`
- `"3.inputs.seed"` 对应 `workflow[3].inputs.seed`
## 添加新工作流
### 步骤 1:导出 ComfyUI 工作流
1. 在 ComfyUI 中创建或打开工作流
2. 点击菜单 → Save (API Format)
3. 保存 JSON 文件
### 步骤 2:创建工作流文件夹
根据工作流类型选择正确的分类目录:
- `text-to-image/` - 文本生成图像
- `image-to-image/` - 图像编辑、转换、处理
- `image-to-video/` - 图像生成视频
- `text-to-video/` - 文本生成视频
- `text-to-audio/` - 文本生成音频/音乐
- `audio-to-audio/` - 音频编辑、风格转换
```bash
# 例如添加一个新的文生图工作流
mkdir workflows/text-to-image/my_workflow
# 复制工作流文件(必须命名为 workflow.json)
cp path/to/exported.json workflows/text-to-image/my_workflow/workflow.json
```
### 步骤 3:创建描述文件 (descriptor.json)
创建 `workflows/[category]/my_workflow/descriptor.json`:
```json
{
"description": "详细的工具能力描述(参考下方编写指南)",
"category": "text-to-image",
"parameters": [
{
"name": "prompt",
"type": "string",
"description": "参数的详细说明,包含使用建议",
"required": true,
"path": "6.inputs.text",
"default": "默认值示例"
},
{
"name": "input_image",
"type": "string",
"subtype": "image", // 标记为图片参数,系统会自动处理上传
"description": "输入图片路径",
"required": true,
"path": "10.inputs.image",
"default": ""
}
]
}
```
### 📝 描述文件编写指南
#### 1. 工具描述 (description) 编写要点
**必须包含的信息:**
- **核心功能**:这个工具能做什么
- **技术特点**:使用什么模型/技术,有何独特优势
- **应用场景**:适合什么场景使用
- **关键参数**:重要的参数说明(如分辨率、时长等)
- **特殊要求**:如必须提供的输入
**⚠️ 重要:参数默认值处理规则**
- **必填参数(required: true)**:
- 不应设置默认值,或设置为空字符串 `""`
- 用户必须明确提供输入值
- 例如:正面提示词、输入图片路径、音频描述等
- **非必填参数(required: false)**:
- 影响创作结果的参数(如负面提示词)应设为 `null` 而非具体值
- 技术参数(如 steps、cfg、seed)可以有合理的默认值
- 避免预设内容影响用户的创作意图
**好的描述示例:**
```json
{
"description": "使用 FLUX.1 Schnell 极速版模型,仅需4步即可生成高质量图像,是速度最快的文生图模型。特别优化了生成速度,适合需要快速预览、实时交互或批量生成的场景。虽然步数少但质量依然出色,支持1024x1024及更高分辨率。是快速原型设计的首选。"
}
```
**描述模板:**
```
使用 [模型名称] [核心功能描述]。[技术特点说明]。[适用场景列举]。[关键能力或限制]。[特殊说明]。
```
#### 2. 参数描述 (parameter description) 编写要点
**必须说明的内容:**
- 参数的作用
- 可接受的值或范围
- 对结果的影响
- 使用建议
**参数描述示例:**
```json
{
"parameters": [
{
"name": "prompt",
"description": "描述想要生成的图像内容,支持中英文,越详细效果越好"
},
{
"name": "denoise",
"description": "去噪强度 (0-1):0.1-0.3轻微修改,0.4-0.7中等变化,0.8-1.0大幅重绘"
},
{
"name": "duration",
"description": "音频时长(秒):1-5秒短音效,10-30秒音乐片段,30-180秒完整作品"
},
{
"name": "input_image",
"type": "string",
"subtype": "image", // 重要:图片参数必须添加此标记
"description": "输入图片的绝对路径,支持 jpg/png 等常见格式"
}
]
}
```
**特殊参数类型说明:**
- **图片参数**:必须添加 `"subtype": "image"` 标记
- 系统会自动检测并处理图片上传
- 支持本地文件路径(自动上传)或已上传的文件名
- 支持多个图片输入(如 start_image、end_image)
- **输出目录参数**(自动添加到所有工具):
- 参数名:`output_dir`
- 类型:string(可选)
- 功能:指定生成文件的保存位置
- 示例:`"/home/username/project/assets"`
- 默认:项目根目录下的 `outputs` 文件夹
#### 3. 分类选择指南
| 分类 | 说明 | 工具名称格式 |
|------|------|------------|
| text-to-image | 根据文本生成图像 | run_text_to_image_workflow_[name] |
| image-to-image | 修改或转换现有图像 | run_image_to_image_workflow_[name] |
| image-to-video | 静态图像转动态视频 | run_image_to_video_workflow_[name] |
| text-to-video | 根据文本生成视频 | run_text_to_video_workflow_[name] |
| text-to-audio | 根据文本生成音频/音乐 | run_text_to_audio_workflow_[name] |
| audio-to-audio | 编辑或转换现有音频 | run_audio_to_audio_workflow_[name] |
### 步骤 4:创建 README.md(可选但推荐)
为工作流创建详细文档 `workflows/[category]/my_workflow/README.md`:
```markdown
# 工作流名称
## 概述
工作流的详细介绍
## 工作流特点
- 特点1
- 特点2
## 主要参数
详细的参数说明
## 使用示例
具体的使用案例
## 注意事项
使用时的注意点
```
### 步骤 5:查找参数路径
1. 打开工作流 JSON 文件
2. 找到需要暴露的参数节点
3. 记录节点 ID 和输入字段名
4. 组合成路径格式:`节点ID.inputs.字段名`
例如,在 JSON 中找到:
```json
{
"6": {
"inputs": {
"text": "提示词内容"
}
}
}
```
对应路径为:`6.inputs.text`
### 步骤 6:重启 Claude Desktop
添加新工作流后,需要重启 Claude Desktop 以重新加载工作流。
## 📚 描述编写最佳实践
### 让 AI 更好理解你的工具
#### ✅ 好的工具描述
```json
"description": "基于现有图像进行智能修改和风格转换的强大工具。可以将照片转换为不同艺术风格(油画、水彩、动漫等),修改图像内容(更换背景、改变季节、调整光线),或增强图像质量。通过调节去噪强度(denoise)精确控制修改程度,从轻微调整到完全重绘。必须提供输入图片路径。"
```
**为什么好?**
- 明确说明了工具的**核心能力**(修改、转换)
- 列举了**具体功能**(风格转换、内容修改、质量增强)
- 提供了**关键参数**说明(denoise)
- 强调了**必需输入**(图片路径)
#### ❌ 差的工具描述
```json
"description": "图生图工作流"
```
**为什么差?**
- 太简短,AI 不知道具体能做什么
- 没有说明使用场景
- 缺少技术特点
### 参数描述技巧
#### 1. 对于数值参数,提供范围和效果说明
```json
{
"name": "cfg",
"description": "CFG强度(1-20):1-3创意自由,4-7平衡效果,8-20严格遵循提示"
}
```
#### 2. 对于文件路径,说明格式要求
```json
{
"name": "input_image",
"description": "输入图片的绝对路径,支持 jpg/png/webp 格式,建议分辨率不低于512x512"
}
```
#### 3. 对于选择型参数,列出所有选项
```json
{
"name": "style",
"description": "艺术风格:realistic(写实)、anime(动漫)、oil_painting(油画)、watercolor(水彩)"
}
```
#### 4. 对于复杂参数,提供示例
```json
{
"name": "prompt",
"description": "图像描述,示例:'阳光明媚的海滩,椰子树,蓝天白云,4K高清,专业摄影'"
}
```
### 常用描述词汇参考
**技术特点词汇:**
- 极速生成、高质量、专业级、优化版、增强版
- 智能识别、精确控制、自动优化、实时处理
- 支持批量、多格式兼容、高分辨率
**应用场景词汇:**
- 适合...场景、特别擅长...、专为...优化
- 创意设计、专业制作、快速原型、批量处理
- 个人创作、商业应用、教育演示
**能力描述词汇:**
- 可以...、支持...、能够...、实现...
- 生成、转换、修改、增强、优化、创建
- 自定义、调节、控制、设置
### 📖 相关文档
- [Negative Prompt 使用规范](docs/negative_prompt_guide.md) - 了解如何正确编写负向提示词
### ✔️ 添加工作流前的检查清单
在添加新工作流前,请确保:
- [ ] 工作流放在正确的分类文件夹中
- [ ] workflow.json 文件名正确
- [ ] descriptor.json 包含 category 字段
- [ ] 工具描述清晰说明了能力和使用场景
- [ ] 每个参数都有详细的描述
- [ ] 必需参数都标记为 required: true
- [ ] 提供了合理的默认值
- [ ] 参数路径 (path) 正确对应 JSON 节点
- [ ] (可选)创建了 README.md 详细文档
## 开发模式
### 本地开发
```bash
# 开发模式(自动重载)
npm run dev
# 重新构建
npm run build
```
### 直接运行
```bash
# 直接运行编译后的文件
node dist/index.js
# 或在 Claude 配置中使用
{
"command": "node",
"args": ["/absolute/path/to/comfyui-mcp/dist/index.js"]
}
```
## 故障排除
### Claude Desktop 无法找到工具
1. 确认项目路径正确(使用绝对路径)
2. 检查 Claude 配置文件格式是否正确
3. 查看 Claude 的开发者工具日志
### WSL2 连接问题
如果无法连接到 Windows 上的 ComfyUI:
1. 确保 ComfyUI 启动时使用 `--listen 0.0.0.0` 参数
2. 检查 Windows 防火墙是否允许端口访问
3. 运行 `scripts/detect-wsl2-host.sh` 重新检测 IP
4. 确保 `BYPASS_PROXY=true` 已设置
### 工作流加载失败
检查以下几点:
- 工作流文件夹名称与内部 JSON 文件名一致
- `descriptor.json` 格式正确
- JSON 路径与实际工作流结构匹配
- 查看控制台错误信息
### npx 执行错误
如果 `npx` 无法执行:
```bash
# 确保使用绝对路径
npx /home/username/comfyui-mcp
# 或直接使用 node
node /home/username/comfyui-mcp/dist/index.js
```
## 工作原理
1. **工作流加载**:启动时扫描 `workflows` 文件夹的分类目录,加载所有工作流
2. **工具注册**:每个工作流注册为 `run_{category}_workflow_{name}` 格式的工具
- 例如:`run_text_to_image_workflow_flux_schnell`
- 例如:`run_image_to_video_workflow_image_to_video_wan`
3. **参数处理**:接收输入参数,根据描述文件的路径映射修改工作流 JSON
4. **执行监控**:通过 WebSocket 连接 ComfyUI,监听执行进度
5. **结果返回**:执行完成后返回生成结果
## 示例工作流
项目包含多个分类的专业工作流:
### 文本生成图像 (text-to-image)
- `run_text_to_image_workflow_image_qwen_image` - Qwen 视觉语言模型,支持中英文提示词
### 图像编辑与处理 (image-to-image)
- `run_image_to_image_workflow_omnigen2_image_edit` - OmniGen2 多模态图像编辑
- `run_image_to_image_workflow_qwen_image_edit` - Qwen 智能图像编辑
- `run_image_to_image_workflow_qwen_image_controlnet_patch` - Qwen + ControlNet 精确控制
- `run_image_to_image_workflow_qwen_image_instantx_controlnet` - Qwen + InstantX 深度控制
- `run_image_to_image_workflow_qwen_image_union_control` - Qwen + Union Control 边缘控制
- `run_image_to_image_workflow_rmbg_multiple_models` - 多模型背景移除
- `run_image_to_image_workflow_yolo_cropper` - YOLO 智能物体检测与裁剪
### 视频生成 (image-to-video & text-to-video)
- `run_image_to_video_workflow_wan2_2_14b_i2v` - WAN 2.2 14B 图片转动态视频
- `run_image_to_video_workflow_wan2_2_14b_flf2v` - WAN 2.2 14B 首尾帧智能插值
- `run_text_to_video_workflow_wan2_2_14b_t2v` - WAN 2.2 14B 文本生成视频
### 音频与音乐生成 (text-to-audio & audio-to-audio)
- `run_text_to_audio_workflow_audio_ace_step_1_t2a_instrumentals` - ACE 纯器乐音乐生成
- `run_text_to_audio_workflow_audio_ace_step_1_t2a_song` - ACE 带歌词歌曲生成
- `run_audio_to_audio_workflow_audio_ace_step_1_a2a_editing` - ACE 音频智能编辑
使用示例:
```python
# 文本生成图像
run_text_to_image_workflow_image_qwen_image:
prompt: "山水画,中国传统风格,青山绿水"
width: 1024
height: 1024
output_dir: "/home/user/outputs"
output_name: "chinese_painting"
# 智能图像编辑
run_image_to_image_workflow_qwen_image_edit:
input_image: "/path/to/image.jpg"
positive_prompt: "去除图片中的文字水印"
output_dir: "/home/user/outputs"
output_name: "clean_image"
# 背景移除
run_image_to_image_workflow_rmbg_multiple_models:
input_image: "/path/to/product.jpg"
model: "BEN2"
output_dir: "/home/user/outputs"
output_name: "transparent_bg"
# 图片生成视频
run_image_to_video_workflow_wan2_2_14b_i2v:
input_image: "/path/to/landscape.jpg"
positive_prompt: "缓慢的云朵飘动,阳光穿过云层"
length: 81
fps: 16
output_dir: "/home/user/videos"
output_name: "animated_landscape"
# 音乐生成
run_text_to_audio_workflow_audio_ace_step_1_t2a_song:
tags: "anime, j-pop, female vocals, piano, emotional"
lyrics: "[verse]\n春の風が吹いて\n桜の花びら舞う\n[chorus]\n君と歩いた道\n忘れない思い出"
seconds: 120
output_dir: "/home/user/music"
output_name: "spring_song"
```
## 环境变量说明
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `WORKFLOWS_DIR` | 工作流文件夹路径 | `./workflows` |
| `COMFYUI_HOST` | ComfyUI 服务器地址 | `localhost` |
| `COMFYUI_PORT` | ComfyUI 服务器端口 | `8000` |
| `BYPASS_PROXY` | 是否绕过系统代理 | `true` |
## 许可证
MIT