内容
# ComfyUI MCP 服务器
<div align="center">

*是的,这张图片是由工具生成的。是的,我们知道 AI 艺术在伦理上存在争议,在最坏的情况下是危险的。我们开发这个工具是为了内部资产生成,而不是为了取代艺术家。请负责任地使用或根本不要使用。*
</div>
---
**当你的 Mac 渲染黑色帧时,你会学会分布式处理。**
我希望 Claude 通过我的本地 ComfyUI 设置生成图像。运行 Sonic。纯黑帧,持续 10 秒。GPU 跟不上。
所以我分布式部署了它。
MCP 服务器在 Fly.io 上运行——无状态,自动扩展。GPU 计算在 RunPod 上运行,按秒计费。生成的资产存储在 Supabase 中,并附带签名 URL。Tailscale 安全地连接了所有这些。最初的 “让我生成一些图像”变成了生产分布式系统,因为否则就相当于一个输出为空的空间加热器。
现在 Claude 可以生成图像,放大图像,运行 ControlNet 管道,进行智能填充/扩展,转移风格与 IP-Adapter,合成语音,并创建口型同步的说话头像视频——所有这些都可以通过自然对话实现。**40 种工具。796 个测试。无 API 费用。完全的参数控制。**
```
你: “生成一个日落时的赛博朋克城市景观,并保存到 ./assets/hero.png”
Claude: 我将为您生成该图像。
[调用 generate_image 并带有提示,保存到 ./assets/hero.png]
完成!赛博朋克城市景观已保存到 ./assets/hero.png
```
## 功能
- **想象工具**:终极生成工具 - 用自然语言描述您想要的内容,并获得带有自动检测模型设置的优化结果
- **智能提示**:根据您的模型(Illustrious, Pony, Flux, SDXL, Realistic, SD1.5)自动生成优化提示
- **管道执行**:在单个命令中链接 txt2img → 高分辨率修复 → 升级
- **质量预设**:从“草稿”(快速)到“超级”(完整管道,带有升级)
- **文本转图像**:使用完全的参数控制从文本提示生成图像
- **图像转图像**:使用 AI 指导转换现有图像
- **AI 升级**:使用 RealESRGAN 和其他模型增强分辨率
- **LoRA 支持**:使用可调整权重的自定义样式和角色 LoRA
- **ControlNet**:使用边缘检测,深度图,姿势等指导生成
- **IP-Adapter**:从参考图像转移样式和构图
- **填充**:选择性地重新生成遮蔽区域,同时保留上下文
- **扩展**:在任意方向扩展画布,并具有一致的 AI 生成
- **智能遮蔽**:使用 GroundingDINO + SAM 分割自动生成遮蔽
- **文本转语音**:使用 F5-TTS 从短音频样本克隆语音
- **口型同步视频**:使用 SONIC 创建口型同步的说话头像视频
- **肖像生成**:多后端头像创建(SDXL,Flux GGUF,Flux FP8)
- **模型发现**:列出可用的检查点模型,LoRA,采样器和调度器
- **队列监控**:检查生成状态和待处理作业
## 先决条件
- [ComfyUI](https://github.com/comfyanonymous/ComfyUI) 在本地运行
- Node.js 20+
- 至少一个 Stable Diffusion 检查点模型
### 所需的自定义节点
某些功能需要额外的 ComfyUI 自定义节点。可以通过 ComfyUI Manager 或手动安装这些节点:
| 功能 | 所需节点 | 仓库 |
|---------|--------------|------------|
| IP-Adapter(风格转移) | ComfyUI_IPAdapter_plus | [cubiq/ComfyUI_IPAdapter_plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) |
| ControlNet 预处理 | comfyui_controlnet_aux | [Fannovel16/comfyui_controlnet_aux](https://github.com/Fannovel16/comfyui_controlnet_aux) |
| 智能遮蔽(SAM) | comfyui_segment_anything | [storyicon/comfyui_segment_anything](https://github.com/storyicon/comfyui_segment_anything) |
| 文本检测(GroundingDINO) | ComfyUI-GroundingDINO | [IDEA-Research/GroundingDINO](https://github.com/IDEA-Research/GroundingDINO) |
| 口型同步(SONIC) | ComfyUI-SONIC | [smthemex/ComfyUI-SONIC](https://github.com/smthemex/ComfyUI-SONIC) |
| TTS(F5-TTS) | ComfyUI-F5-TTS | [chaojie/ComfyUI-F5-TTS](https://github.com/chaojie/ComfyUI-F5-TTS) |
**使用 ComfyUI Manager 快速安装:**
1. 打开 ComfyUI 网页界面
2. 点击“管理器”按钮
3. 搜索节点名称并安装
4. 重启 ComfyUI
**核心功能**(txt2img,img2img,升级,基本 ControlNet)在没有任何自定义节点的情况下工作。
## 快速入门
### 选项 A:从 npm 安装(推荐)
```bash
npx @peleke.s/comfyui-mcp
```
添加到 `~/.claude/settings.json`(全局)或 `.claude/settings.local.json`(项目特定):
```json
{
"mcpServers": {
"comfyui": {
"command": "npx",
"args": ["-y", "@peleke.s/comfyui-mcp"],
"env": {
"COMFYUI_URL": "http://localhost:8188",
"COMFYUI_MODEL": "dreamshaper_8.safetensors"
}
}
}
}
```
### 选项 B:从源代码运行
```bash
git clone https://github.com/Peleke/comfyui-mcp.git
cd comfyui-mcp
npm install
npm run build
```
```json
{
"mcpServers": {
"comfyui": {
"command": "node",
"args": ["/absolute/path/to/comfyui-mcp/dist/index.js"],
"env": {
"COMFYUI_URL": "http://localhost:8188",
"COMFYUI_MODEL": "dreamshaper_8.safetensors"
}
}
}
}
```
### 启动 ComfyUI
确保 ComfyUI 在配置的 URL(默认为 http://localhost:8188)上运行。
### 重启 Claude 代码
**重要**:Claude 代码在启动时加载 MCP 服务器。您必须在添加配置后重启 Claude 代码(退出并重新启动)。
### 生成图像
```
"生成一个肖像,带有温暖的光线,并保存到 ./images/portrait.png"
```
## 可用工具
### generate_image
从文本提示生成图像(txt2img)。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| prompt | 字符串 | 必需 | 生成内容 |
| negative_prompt | 字符串 | "bad quality, blurry" | 避免的内容 |
| width | 数字 | 512 | 图像宽度(像素) |
| height | 数字 | 768 | 图像高度(像素) |
| steps | 数字 | 28 | 采样步骤 |
| cfg_scale | 数字 | 7 | 无分类器指导比例 |
| sampler | 字符串 | "euler_ancestral" | 采样算法 |
| scheduler | 字符串 | "normal" | 噪声调度器 |
| model | 字符串 | 环境默认值 | 检查点模型名称 |
| seed | 数字 | 随机 | 重复性随机种子 |
| loras | 数组 | 无 | 应用的 LoRA(见下文) |
| output_path | 字符串 | 必需 | 保存图像的位置 |
| upload_to_cloud | 布尔值 | true | 上传到云存储并返回签名 URL |
**返回:** `{ success, path, remote_url?, seed, message }`
当 `upload_to_cloud` 为 true 且配置了云存储时,`remote_url` 包含一个有效期为 1 小时的签名 URL。
**LoRA 格式:**
```json
{
"name": "style_lora.safetensors",
"strength_model": 0.8,
"strength_clip": 0.8
}
```
### img2img
使用 AI 指导转换现有图像。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| prompt | 字符串 | 必需 | 生成内容 |
| input_image | 字符串 | 必需 | ComfyUI 输入文件夹中的文件名 |
| denoise | 数字 | 0.75 | 0.0 = 无变化,1.0 = 完全再生 |
| output_path | 字符串 | 必需 | 保存结果的位置 |
| *(plus all txt2img params)* | | | |
### upscale_image
使用 AI 升级模型升级图像。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| input_image | 字符串 | 必需 | ComfyUI 输入文件夹中的文件名 |
| upscale_model | 字符串 | "RealESRGAN_x4plus.pth" | 升级模型 |
| target_width | 数字 | 原始 | 可选的调整宽度 |
| target_height | 数字 | 原始 | 可选的调整高度 |
| output_path | 字符串 | 必需 | 保存结果的位置 |
### 发现工具
| 工具 | 描述 |
|------|-------------|
| list_models | 可用的检查点模型 |
| list_loras | 可用的 LoRA 适配器 |
| list_samplers | 采样算法(euler, dpm++, 等) |
| list_schedulers | 噪声调度器(normal, karras, 等) |
| list_upscale_models | 升级模型(RealESRGAN, 等) |
| get_queue_status | 运行和待处理的作业 |
### imagine(推荐)
**最简单的图像生成方式。** 用自然语言描述您想要的内容,它会处理所有事情:自动检测模型系列,精心设计提示,应用质量预设,并运行完整管道。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| description | 字符串 | 必需 | 自然语言描述 |
| output_path | 字符串 | 必需 | 保存最终图像的位置 |
| model | 字符串 | 环境默认值 | 检查点模型(如果未设置,则自动检测) |
| model_family | 字符串 | 自动 | "illustrious", "pony", "flux", "sdxl", "realistic", "sd15" |
| style | 字符串 | 无 | "anime", "cinematic", "portrait", "landscape" 等 |
| artist_reference | 字符串 | 无 | 艺术家风格,例如 "studio ghibli" |
| quality | 字符串 | "standard" | "draft", "standard", "high", "ultra" |
| loras | 数组 | 无 | 应用的 LoRA |
| seed | 数字 | 随机 | 用于重复性 |
| upload_to_cloud | 布尔值 | true | 上传到云并返回签名 URL |
**返回:** `{ success, imagePath, remote_url?, seed, prompt, modelFamily, pipelineSteps, settings, message }`
**质量预设:**
- `draft`:快速生成,仅限 txt2img
- `standard`:平衡质量(默认)
- `high`:包括高分辨率修复通道
- `ultra`:带有高分辨率修复 + 升级的完整管道
### execute_pipeline
运行多步骤生成管道:txt2img → 高分辨率修复 → 升级。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| prompt | 字符串 | 必需 | 积极的提示 |
| model | 字符串 | 必需 | 检查点模型 |
| output_path | 字符串 | 必需 | 最终输出位置 |
| enable_hires_fix | 布尔值 | false | 添加 img2img 精炼通道 |
| hires_denoise | 数字 | 0.4 | 高分辨率去噪(推荐 0.3-0.5) |
| enable_upscale | 布尔值 | false | 添加 AI 升级步骤 |
| *(plus all txt2img params)* | | | |
### craft_prompt
从自然描述中生成优化的提示。当您想要在生成前查看/编辑提示时很有用。
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| description | 字符串 | 必需 | 自然语言描述 |
| model_name | 字符串 | 无 | 用于自动检测模型系列 |
| model_family | 字符串 | 自动 | 显式系列覆盖 |
| style | 字符串 | 无 | 应用的样式预设 |
| rating | 字符串 | "safe" | 内容评级(适用于 Pony 模型) |
返回:优化的积极提示,消极提示,推荐设置,LoRA 建议。
### get_prompting_guide
获取特定模型系列的提示和示例提示。
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| model_family | 字符串 | 是 | "illustrious", "pony", "flux" 等 |
### list_prompting_strategies
列出所有支持的模型系列及其提示特征。
### ControlNet 工具
使用参考图像的结构信息指导图像生成。
| 工具 | 描述 |
|------|-------------|
| generate_with_controlnet | 单个 ControlNet 条件(canny, depth, pose 等) |
| generate_with_multi_controlnet | 结合多个 ControlNet 条件 |
| preprocess_control_image | 预览控制信号(边缘图,骨架等) |
| generate_with_hidden_image | 使用 QR Code ControlNet 嵌入隐藏图像 |
| stylize_photo | 将照片转换为艺术风格(anime, oil painting) |
| generate_with_pose | 使用 OpenPose 复制参考图像的姿势 |
| generate_with_composition | 使用语义分割匹配布局/构图 |
| list_controlnet_models | 按类型列出可用的 ControlNet 模型 |
**支持的控制类型:`canny`, `depth`, `openpose`, `qrcode`, `scribble`, `lineart`, `semantic_seg`
### IP-Adapter
从参考图像转移样式、构图或角色相似度。
> **需要:** [ComfyUI_IPAdapter_plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) 自定义节点
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| prompt | 字符串 | 必需 | 生成提示 |
| reference_image | 字符串 | 必需 | 参考图像文件名 |
| influence | 字符串 | "balanced" | "subtle", "balanced", "strong", "dominant" |
| transfer_type | 字符串 | "style" | "style", "composition", "face" |
| output_path | 字符串 | 必需 | 保存结果的位置 |
### 填充和扩展
选择性地编辑图像区域或扩展画布边界。
| 工具 | 描述 |
|------|-------------|
| inpaint | 再生遮蔽区域(白色 = 再生,黑色 = 保留) |
| outpaint | 在任意方向扩展画布,并具有 AI 生成的内容 |
| create_mask | 使用 AI 分割或手动区域生成掩模 |
**inpaint 参数:
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| prompt | 字符串 | 必需 | 遮蔽区域生成内容 |
| source_image | 字符串 | 必需 | 源图像文件名 |
| mask_image | 字符串 | 必需 | 掩模图像(白色 = 填充) |
| denoise_strength | 数字 | 0.75 | 0.0 = 无变化,1.0 = 完全再生 |
| output_path | 字符串 | 必需 | 保存结果的位置 |
**outpaint 参数:
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| prompt | 字符串 | 必需 | 扩展区域生成内容 |
| source_image | 字符串 | 必需 | 源图像文件名 |
| extend_left/right/top/bottom | 数字 | 0 | 扩展像素 |
| feathering | 数字 | 40 | 边缘混合像素 |
| output_path | 字符串 | 必需 | 保存结果的位置 |
**create_mask 参数:
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| source_image | 字符串 | 必需 | 创建掩模的图像 |
| preset | 字符串 | 无 | "hands", "face", "eyes", "body", "background", "foreground" |
| text_prompt | 字符串 | 无 | 自定义检测(“red shirt”, “the cat”) |
| region | 对象 | 无 | 手动 {x, y, width, height} 百分比 |
| expand_pixels | 数字 | 0 | 向外扩展 |
| feather_pixels | 数字 | 0 | 模糊掩模边缘 |
| invert | 布尔值 | false | 交换黑/白 |
| output_path | 字符串 | 必需 | 保存掩模的位置 |
### 文本转语音(F5-TTS)
从短参考音频克隆语音。
| 工具 | 描述 |
|------|-------------|
| tts_generate | 从文本克隆语音生成语音 |
| list_tts_models | 可用的 TTS 模型 |
| list_voices | 可用的语音样本 |
**tts_generate 参数:
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| text | 字符串 | 必需 | 要朗读的文本 |
| voice_reference | 字符串 | 必需 | 用于语音克隆的参考音频 |
| voice_reference_text | 字符串 | 无 | 参考文本(提高质量) |
| speed | numeric | 1.0 | 语音速度(0.5-2.0) |
| output_path | 字符串 | 必需 | 保存音频的位置 |
### 口型同步视频
从肖像和音频创建口型同步视频。
| 工具 | 描述 |
|------|-------------|
| lipsync_generate | 从图像 + 音频生成口型同步视频 |
| talk | 完整管道:文本 → TTS → 口型同步 → 视频 |
| list_lipsync_models | 可用的口型同步模型 |
| list_avatars | 输入/avatars/ 目录中的肖像图像 |
| list_voices_catalog | 带有元数据的语音样本 |
### 肖像生成
生成针对口型同步和头像使用的 AI 优化肖像。
| 工具 | 描述 |
|------|-------------|
| create_portrait | 使用样式/表情控制生成单个肖像 |
| batch_create_portraits | 批量生成多个肖像 |
**后端选项:** `sdxl`(检查点),`flux_gguf`(量化),`flux_fp8`(全精度)
### 健康与诊断
| 工具 | 描述 |
|------|-------------|
| check_connection | 完整的健康检查,包括 GPU 信息和延迟 |
| ping_comfyui | 快速连接检查 |
## 使用示例
### 使用 Imagine(推荐)
```
"想象一个温暖的咖啡店,带有温暖的光线和植物,
保存到 ./assets/coffee_shop.png 使用高质量"
```
```
"创建一个具有动漫风格的战士公主肖像,
风格:动漫,质量:超级"
```
```
"生成一个专业的白色背景产品照片,
使用我的现实模型,艺术家参考:苹果产品摄影"
```
### 基本生成
```
"生成一个金色时段的山景,保存到 ./assets/landscape.png"
```
### 带有 LoRA
```
"使用 animeStyle.safetensors LoRA
以 0.8 强度创建动漫风格肖像,保存到 ./output/anime_portrait.png"
```
### 图像转换
```
"从 ComfyUI 输入文件夹中的 sketch.png 草图
转变成详细插图,降噪级别 0.7"
```
### 升级
```
"使用 RealESRGAN 将 hero.png 升级到 4K"
```
### 批量工作流
```
"生成 3 个不同光线条件的森林场景变化:
1. 雾蒙蒙的早晨
2. 正午阳光
3. 树林中的日落
保存到 ./scenes/forest_*.png"
```
## 架构
```
┌─────────────┐ MCP 协议 ┌─────────────┐ REST/WS ┌──────────┐
│ Claude │ ◄─────────────────► │ MCP 服务器 │ ◄─────────────► │ ComfyUI │
│ (客户端) │ 工具调用 │ (桥梁) │ 工作流程 │ (API) │
└─────────────┘ └─────────────┘ └──────────┘
```
MCP 服务器:
1. 向 AI 客户端公开工具
2. 接收带有参数的请求
3. 构建 ComfyUI 工作流程 JSON
4. 通过 REST API 将工作流程排队
5. 通过 WebSocket 监视进度
6. 检索和保存生成的图像
### ComfyUI 工作流简介
ComfyUI 将图像生成表示为节点的图。每个节点执行一个操作:
```
CheckpointLoader → CLIPTextEncode → KSampler → VAEDecode → SaveImage
↓ ↑
LoraLoader(s) ──────────────────────┘
```
我们的服务器根据您的参数动态构建这些图。当您指定 LoRAs 时,我们会将 LoraLoader 节点注入链中。工作流作为 JSON 提交到 ComfyUI 的 `/prompt` 端点。
### 为什么选择这种架构
这里的一些决定并非来自 AI,而是来自了解什么会在规模上出现问题:
- **分布式速率限制(Upstash Redis)**:内存速率限制器在多个 Fly.io 实例的情况下会失败。滑动窗口算法、基于层级的限制、每个 API 密钥带有 IP 备用。
- **Quirrel 用于长时间运行的作业**:Fly.io 有连接限制(25 个硬限制,20 个软限制)。肖像生成、TTS 和 lipsync 通过作业队列异步运行。否则,HTTP 超时将杀死请求。
- **存储抽象层**:单一接口,三个实现(Supabase、GCP、本地)。通过环境变量交换提供商。没有供应商锁定。
- **Tailscale 网格**:RunPod URL 是公开的。Tailscale 在 Fly.io 和 GPU 节点之间添加了一层安全保护。
- **用于提示的策略模式**:Illustrious 需要标签,Flux 需要自然语言,Pony 需要分数标签。六个模型家族,六种策略,根据检查点名称自动检测。否则将变得难以维护。
AI 建议“在本地使用 Playwright”进行浏览器自动化。在分布式上下文中,这根本不合理。知道何时分布很重要。
## 环境变量
### 核心
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| COMFYUI_URL | http://localhost:8188 | ComfyUI API 端点 |
| COMFYUI_MODEL | (无) | 默认检查点模型 |
| COMFYUI_OUTPUT_DIR | /tmp/comfyui-output | 备用输出目录 |
### 云存储(可选)
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| STORAGE_PROVIDER | (无) | 设置为“supabase”以启用云上传 |
| SUPABASE_URL | (无) | 您的 Supabase 项目 URL |
| SUPABASE_SECRET_KEY | (无) | Supabase 服务角色密钥(sb_secret_...) |
| SUPABASE_BUCKET | generated-assets | 存储桶名称 |
### HTTP 服务器
| 变量 | 默认值 | 描述 |
| --- | --- | --- |
| PORT | 3001 | HTTP 服务器端口 |
| NODE_ENV | development | 设置为“production”以适用于 Fly.io |
## 项目结构
```
comfyui-mcp/
├── src/
│ ├── index.ts # MCP 服务器入口点(40 个工具)
│ ├── comfyui-client.ts # ComfyUI REST/WebSocket 客户端
│ ├── workflows/
│ │ ├── txt2img.json # 文本到图像模板
│ │ ├── img2img.json # 图像到图像模板
│ │ ├── upscale.json # 缩放模板
│ │ ├── inpaint.json # 修复模板
│ │ ├── outpaint.json # 外部修复模板
│ │ └── builder.ts # 工作流参数化和 LoRA 注入
│ ├── prompting/ # 智能提示生成系统
│ │ ├── generator.ts # 主要 PromptGenerator 类
│ │ ├── model-detection.ts# 自动检测模型家族
│ │ └── strategies/ # 每个模型的提示策略
│ ├── storage/ # 云存储抽象
│ │ ├── index.ts # 提供商工厂
│ │ └── supabase.ts # Supabase 实现
│ └── tools/
│ ├── imagine.ts # 主要生成工具
│ ├── pipeline.ts # 多步骤管道执行器
│ ├── controlnet.ts # ControlNet 工具
│ ├── ipadapter.ts # IP-Adapter 风格转换
│ ├── inpaint.ts # 修复/外部修复/蒙版工具
│ ├── tts.ts # 文本到语音(F5-TTS)
│ ├── lipsync.ts # 口型同步视频生成
│ ├── avatar.ts # 肖像生成
│ └── health.ts # 连接诊断
├── deploy/ # RunPod 部署
│ ├── serverless/ # 无服务器处理程序
│ ├── terraform/ # 基础设施即代码
│ └── scripts/ # 部署实用程序
├── buildlog/ # 开发日志
├── .github/workflows/ # CI/CD 管道
├── vitest.config.ts # 测试配置
├── BUILD_JOURNAL.md # 功能叙述
└── README.md
```
## 开发
```bash
# 安装依赖
npm install
# 以开发模式运行
npm run dev
# 构建生产版本
npm run build
# 运行生产版本
npm start
# 运行测试
npm test
# 以监视模式运行测试
npm run test:watch
# 运行测试并生成覆盖率报告
npm run test:coverage
```
**796 个测试**,涵盖所有工具、提示策略、存储提供商和管道执行。
## 故障排除
### 工具未在 Claude Code 中显示
1. 确保在添加 MCP 配置后重新启动 Claude Code
2. 验证服务器是否可以手动启动:`npx @peleke.s/comfyui-mcp` (应打印“ComfyUI MCP 服务器正在 stdio 上运行”)
3. 尝试杀死所有 Claude Code 实例并重新启动
### “连接被拒绝”**
确保 ComfyUI 在配置的 COMFYUI_URL 上运行。
### “模型未找到”**
运行 `list_models` 以查看可用的检查点。模型名称必须与文件名完全匹配,包括文件扩展名。
### “输出中没有图像”**
在 ComfyUI 的 Web 界面中检查工作流错误。排队的提示可能由于缺少节点或参数无效而失败。
### “节点不存在”错误
某些功能需要自定义节点。如果您看到类似 `IPAdapterModelLoader 不存在` 或 `DWPreprocessor 不存在` 的错误,请安装所需的自定义节点(请参见先决条件部分)。
### 生成速度慢
生成时间取决于硬件、模型大小和步骤数。减少步骤以获得更快的草稿。
### LoRA 未应用
使用 `list_loras` 验证 LoRA 文件名。确保强度值合理(通常为 0.5-1.2)。
## 扩展
代码库设计用于扩展:
- **视频生成**:ComfyUI 支持 AnimateDiff — 相同的工作流模式适用
- **自定义节点**:任何 ComfyUI 自定义节点都可以集成到工作流模板中
- **新模型家族**:在 `src/prompting/strategies/` 中添加提示策略
- **其他后端**:使用新的模型后端扩展肖像生成
## 云部署
### 架构概述
```mermaid
flowchart TB
subgraph Client["客户端层"]
CC[Claude Code<br/>MCP 客户端]
WEB[Web 应用<br/>landline-landing]
end
subgraph Service["服务层(Fly.io)"]
MCP[comfyui-mcp<br/>MCP 服务器]
HTTP[HTTP 服务器<br/>REST API]
end
subgraph GPU["GPU 层(RunPod)"]
COMFY[ComfyUI<br/>RTX 4090]
end
subgraph Storage["存储层(Supabase)"]
BUCKET[存储桶<br/>generated-assets]
SIGNED[签名 URL<br/>1 小时有效期]
end
CC -->|MCP 协议| MCP
WEB -->|HTTPS REST| HTTP
MCP -->|代理 URL| COMFY
HTTP -->|代理 URL| COMFY
MCP -->|上传| BUCKET
HTTP -->|上传| BUCKET
BUCKET -->|生成| SIGNED
SIGNED -->|在浏览器中查看| WEB
SIGNED -->|在浏览器中查看| CC
```
### 工作原理
1. **客户端请求**:Claude Code(通过 MCP)或 Web 应用(通过 HTTP)发送生成请求
2. **服务处理**:服务构建 ComfyUI 工作流并排队
3. **GPU 执行**:RunPod 在租用的 GPU(RTX 4090)上执行工作流
4. **云存储**:结果上传到 Supabase 存储
5. **签名 URL**:返回一个 1 小时签名 URL,用于安全浏览器查看
### RunPod 设置
没有本地 GPU?在 RunPod 上运行 ComfyUI 并远程连接。
1. 使用 PyTorch 模板创建 RunPod Pod
2. SSH 进入并运行:
```bash
curl -fsSL https://raw.githubusercontent.com/Peleke/comfyui-mcp/main/deploy/quick-deploy.sh | bash -s -- --dreamshaper
```
3. 获取 Pod URL:`https://<POD_ID>-8188.proxy.runpod.net`
4. 配置本地:
```bash
./deploy/scripts/configure-local.sh https://<POD_ID>-8188.proxy.runpod.net
```
查看 [deploy/README.md](./deploy/README.md) 以获取详细说明。
### 云存储(Supabase)
生成的图像可以自动上传到 Supabase 存储,并使用签名 URL 进行安全共享。
**设置:**
1. 创建一个 Supabase 项目
2. 创建一个名为 `generated-assets` 的存储桶
3. 添加 RLS 策略:`true`(或 `auth.role() = 'service_role'` 以限制访问)
4. 设置环境变量(见下文)
**用法:**
- MCP 工具(`imagine`、`generate_image`)默认包含 `upload_to_cloud: true`
- 结果包括一个 `remote_url` 字段,带有 1 小时签名 URL
- 可以直接在浏览器中打开 URL 进行查看
### HTTP 服务器(Web 集成)
对于无法直接使用 MCP 的 Web 应用,提供了一个 HTTP 服务器:
```bash
# 启动 HTTP 服务器
npm run serve
# 或
node dist/http-server.js
```
**端点:**
| 端点 | 方法 | 描述 |
| --- | --- | --- |
| `/health` | GET | 健康检查,包含 GPU 信息 |
| `/imagine` | POST | 自然语言图像生成 |
| `/image` | POST | 直接 txt2img 生成 |
| `/portrait` | POST | AI 肖像生成 |
| `/tts` | POST | 文本到语音,F5-TTS |
| `/lipsync` | POST | 视频口型同步,MuseTalk |
**示例:**
```bash
curl -X POST https://your-service.fly.dev/imagine \
-H "Content-Type: application/json" \
-d '{
"description": "一个赛博朋克城市景观,日落时分",
"output_path": "/tmp/cyberpunk.png"
}'
# 响应:
{
"success": true,
"imagePath": "/tmp/cyberpunk.png",
"signedUrl": "https://xxx.supabase.co/storage/v1/object/sign/...",
"seed": 1234567890,
"message": "✨ 图像成功生成!"
}
```
### Fly.io 部署
将 HTTP 服务器部署到 Fly.io 以进行生产 Web 集成:
```bash
# 安装 flyctl
curl -L https://fly.io/install.sh | sh
# 部署
fly launch
fly secrets set \
COMFYUI_URL="https://<POD_ID>-8188.proxy.runpod.net" \
COMFYUI_MODEL="novaFurryXL.safetensors" \
SUPABASE_URL="https://xxx.supabase.co" \
SUPABASE_SECRET_KEY="sb_secret_xxx" \
SUPABASE_BUCKET="generated-assets" \
STORAGE_PROVIDER="supabase"
fly deploy
```
## 相关
- [ComfyUI](https://github.com/comfyanonymous/ComfyUI) - 我们正在包装的后端
- [MCP SDK](https://github.com/modelcontextprotocol/sdk) - 协议实现
- [Claude Code](https://claude.ai/code) - 主要 MCP 客户端
## 许可证
MIT
---
**完整教程**:参见 [ARTICLE.md](./ARTICLE.md) 以获取从头开始构建此服务器的详细演练,包括架构决策和实现细节。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器