ComfyUI工作流自动化服务器

为ComfyUI提供全面的工作流自动化、管理和图像生成功能的服务器。

  • by IO-AtelierTech
  • Python
  • 本地部署
  • 14 星标
  • 更新于
在 GitHub 查看 IO-AtelierTech/comfyui-mcp

使用说明

Comfy MCP服务器

MCP服务器,用于全面的ComfyUI工作流自动化、管理和图像生成。

概述

此服务器为Claude Code(和其他MCP客户端)提供对ComfyUI功能的完全访问权限:

  • 系统监控:检查服务器运行状况、队列状态和历史记录
  • 工作流执行:运行已保存的工作流或执行自定义工作流字典
  • 工作流管理:创建、修改、保存和验证工作流
  • 节点发现:列出可用节点、模型及其参数
  • 图像生成:简单的基于提示的生成或完整的工作流控制

主要特点

✅ 架构验证的工作流

所有生成的工作流都会根据 ComfyUI v0.4工作流模式,确保兼容性和正确执行。不再有无效的工作流错误。

🎨 美观的视觉布局

程序化生成的工作流 相干节点位置 具有适当的间距和对齐。内置的布局引擎可以生成无棱角、专业外观的工作流,这些工作流易于在ComfyUI编辑器中阅读和修改。

技术:使用基于图的布局算法(NetworkX)自动定位节点,从程序化工作流生成中消除了典型的意大利面条图。

先决条件

  • 紫外线 -Python包管理器
  • 正在运行ComfyUI服务器(本地或远程)
  • 从ComfyUI导出的工作流文件(API格式)

安装

通过PyPI(推荐)

# Run directly with uvx
uvx comfyui-easy-mcp

# Or install globally
uv pip install comfyui-easy-mcp

来自源头

git clone https://github.com/IO-AtelierTech/comfyui-mcp.git
cd comfyui-mcp
uv sync

配置

环境变量

变量 必填 默认 描述
COMFY_URL 没有 http://localhost:8188 安慰服务器URL
COMFY_URL_EXTERNAL 否 与COMFY_URL相同 用于图像检索的外部URL
COMFY_WORKFLOWS_DIR 没有 - API格式工作流的目录(执行)
COMFY_WORKFLOWS_UI_DIR 无 - UI格式工作流目录(编辑器)
COMFY_WORKFLOW_JSON_FILE 无 - 默认工作流文件 generate_image
PROMPT_NODE_ID 无 - 默认提示节点ID generate_image
OUTPUT_NODE_ID 否 - 默认输出节点ID
OUTPUT_MODE 没有 file 输出模式: file (图片)或 url (字符串URL)
POLL_TIMEOUT 没有 60 等待工作流的最长时间(1-300)
POLL_INTERVAL 没有 1.0 状态轮询之间的秒数(0.1-10.0)

配置示例

export COMFY_URL=http://localhost:8188
export COMFY_WORKFLOWS_DIR=/path/to/workflows-api      # API format for execution
export COMFY_WORKFLOWS_UI_DIR=/path/to/workflows-ui    # UI format for editor
export COMFY_WORKFLOW_JSON_FILE=/path/to/workflows-api/default.json
export PROMPT_NODE_ID=6
export OUTPUT_NODE_ID=9
export OUTPUT_MODE=file

Claude桌面配置

{
  "mcpServers": {
    "ComfyUI": {
      "command": "uvx",
      "args": ["comfyui-easy-mcp"],
      "env": {
        "COMFY_URL": "http://localhost:8188",
        "COMFY_WORKFLOWS_DIR": "/path/to/workflows-api",
        "COMFY_WORKFLOWS_UI_DIR": "/path/to/workflows-ui",
        "COMFY_WORKFLOW_JSON_FILE": "/path/to/workflows-api/default.json",
        "PROMPT_NODE_ID": "6",
        "OUTPUT_NODE_ID": "9"
      }
    }
  }
}

或者使用预先配置的 .mcp.json 从 安慰的.

可用工具

系统工具

工具 说明
get_system_stats() 获取ComfyUI服务器运行状况:版本、内存、设备信息
get_queue_status() 获取当前队列:正在运行和挂起的作业
get_history(limit=10) 获取最近一代历史记录(1-100个条目)
cancel_current(prompt_id=None) 中断电流生成
clear_queue(delete_ids=None) 清除队列或删除特定项目

发现工具

工具 说明
list_nodes(filter=None) 列出可用的ComfyUI节点(可选筛选器)
get_node_info(node_name) 获取详细的节点信息:输入、输出、参数
search_nodes(query) 按名称、类型或类别搜索节点
list_models(folder="checkpoints") 在文件夹中列出模型
list_model_folders() 列出可用的模型文件夹类型
list_embeddings() 列出可用嵌入
list_extensions() 列出加载的扩展(自定义节点包)
refresh_nodes() 从ComfyUI刷新缓存节点列表

工作流管理工具

工具 说明
list_workflows() 列出可用的工作流文件
load_workflow(workflow_name) 从文件加载工作流
save_workflow(workflow, name, format="ui") 保存工作流(格式:“api”或“ui”)
create_workflow() 创建空工作流结构
add_node(workflow, node_id, class_type, inputs) 向工作流添加节点
remove_node(workflow, node_id) 从工作流中删除节点
update_node_input(workflow, node_id, input_name, value) 更新节点的输入
validate_workflow(workflow) 验证工作流结构和节点类型
convert_workflow_to_ui(workflow) 将API格式转换为UI/Litegraph格式
list_templates() 列出可用的工作流模板
get_workflow_template(template_name) 获取预构建的工作流模板
generate_workflow_name(words=2) 生成随机有趣的工作流名称

执行工具

工具 说明
generate_image(prompt) 使用默认工作流生成图像(简单界面)
run_workflow(workflow_name, inputs=None, output_node_id=None) 执行已保存的工作流文件
execute_workflow(workflow, output_node_id) 执行任意工作流字典
submit_workflow(workflow) 无需等待即可提交工作流(返回prompt_id)
get_prompt_status(prompt_id) 获取已提交提示的状态
get_result_image(prompt_id, output_node_id) 从完成的提示中获取结果图像

工作流格式

ComfyUI使用两种工作流格式。理解差异至关重要:

格式 结构 用例 目录
API {"node_id": {"class_type": "...", "inputs": {...}}} MCP执行、自动化 workflows-api/
用户界面 {"nodes": [...], "links": [...], "version": ...} 仅限ComfyUI编辑器 workflows-ui/

重要:

  • 仅 API格式 工作流可以通过MCP执行(run_workflow(), execute_workflow())
  • UI格式 工作流用于在ComfyUI web编辑器中加载/编辑
  • 如果您尝试执行UI格式工作流,MCP服务器将拒绝并返回错误

格式检测

服务器通过检查以下内容自动检测格式 "nodes" 或 "version" 按键(UI格式)vs "class_type" 密钥(API格式)。

创建、验证和保存工作流

推荐的工作流程

# 1. CREATE: Start with empty workflow or template
wf = create_workflow()
# Or use a template:
wf = get_workflow_template("fal-flux-dev")

# 2. BUILD: Add nodes with explicit connections
wf = add_node(wf, "1", "LoadImage", {"image": "input.jpg"})
wf = add_node(wf, "2", "LumaImageToVideoNode", {
    "prompt": "smooth camera motion",
    "model": "ray-2",
    "first_image": ["1", 0],  # Connect to node "1", output index 0
    "resolution": "1080p",
    "duration": "5s"
})
wf = add_node(wf, "3", "SaveVideo_fal", {
    "videos": ["2", 0],
    "filename_prefix": "output"
})

# 3. VALIDATE: Check structure and node types before saving
validation = validate_workflow(wf)
# Returns: {"valid": true/false, "errors": [...], "warnings": [...]}

# 4. SAVE: Choose format based on purpose
# For MCP execution (API format):
save_workflow(wf, "my-workflow", format="api")  # → workflows-api/my-workflow.json

# For ComfyUI editor (UI format):
save_workflow(wf, "my-workflow", format="ui")   # → workflows-ui/my-workflow.json

节点连接

连接使用以下格式 ["source_node_id", output_index]:

# Connect node "1" output slot 0 to this input
wf = add_node(wf, "2", "CLIPTextEncode", {
    "text": "my prompt",
    "clip": ["1", 0]  # ← Connection to node "1", first output
})

发现节点参数

在添加节点之前,请检查其所需的输入:

# Find available nodes
nodes = list_nodes(filter="Luma")  # → ["LumaImageToVideoNode", ...]

# Get node details
info = get_node_info("LumaImageToVideoNode")
# Returns:
# {
#   "input": {
#     "required": {
#       "prompt": ["STRING", {...}],
#       "model": [["ray-2", "ray-flash-2"], {...}],
#       "first_image": ["IMAGE"],
#       ...
#     },
#     "optional": {...}
#   },
#   "output": ["VIDEO"],
#   ...
# }

验证错误

常见验证问题:

错误 原因 修复
Unknown node type 节点类不存在 使用 list_nodes() 查找正确的名称
Missing required input 未提供所需输入 检查 get_node_info() 用于所需的输入
Invalid connection 源节点/输出不存在 验证节点ID和输出索引
UI format detected 正在尝试执行UI格式 使用API格式或从ComfyUI重新导出

使用示例

简单图像生成

# Using default workflow configuration
result = generate_image("a cyberpunk city at sunset")

运行命名工作流

# Execute saved workflow with custom inputs
result = run_workflow(
    "flux-dev.json",
    inputs={"6": {"text": "a forest landscape"}},
    output_node_id="9"
)

构建和执行自定义工作流

# 1. Create empty workflow
wf = create_workflow()

# 2. Add nodes
wf = add_node(wf, "1", "CheckpointLoaderSimple", {
    "ckpt_name": "flux-dev.safetensors"
})
wf = add_node(wf, "2", "CLIPTextEncode", {
    "text": "beautiful sunset over mountains",
    "clip": ["1", 1]  # Connect to checkpoint's CLIP output
})
wf = add_node(wf, "3", "KSampler", {
    "model": ["1", 0],
    "positive": ["2", 0],
    # ... other inputs
})

# 3. Validate before execution
validation = validate_workflow(wf)
if not validation.get("valid"):
    print(f"Errors: {validation.get('errors')}")

# 4. Execute
result = execute_workflow(wf, output_node_id="9")

异步工作流提交

# Submit without waiting
submission = submit_workflow(workflow)
prompt_id = submission["prompt_id"]

# Check status later
status = get_prompt_status(prompt_id)

# Get result when ready
if status["completed"]:
    image = get_result_image(prompt_id, "9")

发现可用节点

# List all fal.ai nodes
nodes = list_nodes(filter="fal")

# Get details about a specific node
info = get_node_info("RemoteCheckpointLoader_fal")

使用fal.ai连接器

这 ComfyUI假连接器 通过fal.ai启用云GPU推理。

# 1. Verify fal.ai extension is loaded
extensions = list_extensions()
# Should include "ComfyUI-fal-Connector"

# 2. List available fal.ai nodes
fal_nodes = list_nodes(filter="fal")
# Returns: ["RemoteCheckpointLoader_fal", "StringInput_fal", "SaveImage_fal", ...]

# 3. Get node details
info = get_node_info("RemoteCheckpointLoader_fal")
# Shows available checkpoints: flux-dev, flux-schnell, sd3.5-large, etc.

# 4. Build a fal.ai workflow
wf = create_workflow()
wf = add_node(wf, "1", "RemoteCheckpointLoader_fal", {
    "ckpt_name": "flux-dev"
})
wf = add_node(wf, "2", "StringInput_fal", {
    "text": "a futuristic city at sunset, cyberpunk style"
})
wf = add_node(wf, "3", "CLIPTextEncode", {
    "text": ["2", 0],
    "clip": ["1", 1]
})
# ... add sampler, VAE decode, save image nodes

# 5. Execute on fal.ai cloud GPUs
result = execute_workflow(wf, output_node_id="9")

环境设置:

export FAL_KEY=your-fal-api-key

建筑

comfy_mcp_server/
├── __init__.py      # Entry point, FastMCP server
├── api.py           # HTTP helpers, ComfyUI API functions
├── models.py        # Pydantic models for type safety
├── settings.py      # Configuration with pydantic-settings
├── compat.py        # Version compatibility layer
└── tools/           # MCP tool implementations
    ├── system.py    # System monitoring tools
    ├── discovery.py # Node/model discovery
    ├── workflow.py  # Workflow management
    └── execution.py # Workflow execution

发展

# Install dev dependencies
uv sync --all-extras

# Run linting
uv run ruff check src/

# Run tests (requires running ComfyUI)
uv run pytest tests/

# Format code
uv run ruff format src/

ComfyUI API覆盖范围

目标: ComfyUI 0.3.x - 0.4.x 版本

API端点 方法 描述 状态
/prompt POST 提交工作流以供执行 ✅ 已执行
/queue GET 查看正在运行/挂起的作业 ✅ 已执行
/queue POST 清除队列/删除项目 ✅ 已执行
/history GET 查看生成历史记录 ✅ 已执行
/history/{id} GET 获取具体作业结果 ✅ 已执行
/history POST 删除历史记录条目 ⚠️ 部分
/interrupt POST 停止当前一代 ✅ 已执行
/object_info GET 列出所有可用节点 ✅ 已执行
/object_info/{node} GET 获取节点参数/输入 ✅ 已执行
/models GET 列出模型文件夹 ✅ 已执行
/models/{folder} GET 列出文件夹中的模型 ✅ 已执行
/system_stats GET 服务器运行状况/资源 ✅ 已执行
/view GET 检索生成的图像 ✅ 已执行
/embeddings GET 列出可用嵌入 ✅ 已执行
/extensions GET 列出已加载的扩展名 ✅ 已执行
/upload/image POST 上传工作流图像 ❌ 未实施
/upload/mask POST 上传修复掩码 ❌ 未实施
/free POST 可用VRAM/内存 ❌ 未实施
/api/userdata/* * 用户数据管理 ❌ 未实施

实现说明

  • 部分的:历史删除未完全作为工具公开
  • 未实现:图像/掩码上传、内存管理和用户数据API计划在未来发布

兼容性

  • MCP服务器版本: 0.2.0
  • 最小ComfyUI: 0.3.0
  • 最大测试ComfyUI:0.4.x
  • python: 3.10+

该服务器包含一个兼容层,用于处理ComfyUI版本之间的API差异,并提供优雅的降级。

许可证

MIT许可证-请参阅 许可证 文件。

学分

最初分叉自 @拉兰尼卡里姆/康菲尤伊mcp.