ComfyUI集成服务

一个本地HTTP服务,允许LLM代理提交ComfyUI工作流模板,等待生成完成,并接收生成的元数据和文件URL。

  • by suilevap
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 suilevap/comfyui_mcp

使用说明

ComfyUI集成服务(适用于LM Studio/LLM代理)

允许任何LLM代理执行以下操作的小型本地HTTP服务:

  1. 提交ComfyUI工作流模板,
  2. 等待世代结束,
  3. 接收工件元数据和直接文件URL。

这是有意通用的,因此它适用于LM Studio插件/工具和其他代理框架。

它的作用

  • 调用本地ComfyUI API(/prompt, /history/{prompt_id}, /view, /ws).
  • 支持带有占位符的工作流模板,如 {{prompt}}.
  • 可以从磁盘加载工作流,也可以在请求JSON中内联一个工作流。
  • 返回生成的工件(图像文件名+URL)。

需求

  • Python 3.10+
  • 本地ComfyUI正在运行(默认值: http://127.0.0.1:8188)

设置

cd $PROJECT_ROOT
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

跑

source .venv/bin/activate
export COMFYUI_BASE_URL=http://127.0.0.1:8188
export WORKFLOW_ROOT=./workflows
uvicorn app:app --host 127.0.0.1 --port 8099

打开API文档:

API

POST /generate

单次呼叫提交+等待。

例子:

curl -X POST http://127.0.0.1:8099/generate \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_path": "text2img.template.json",
    "inputs": {
      "prompt": "a cinematic photo of a red fox in snow",
      "negative_prompt": "blurry, low quality",
      "checkpoint": "v1-5-pruned-emaonly.safetensors",
      "seed": 123456789,
      "steps": 25,
      "cfg": 7.5,
      "width": 768,
      "height": 768,
      "filename_prefix": "lmstudio"
    },
    "timeout_sec": 240,
    "poll_interval_sec": 1
  }'

答复包括:

  • prompt_id
  • artifacts[] 随着 filename, subfolder, type, url

POST /generate/stream

使用服务器发送事件(SSE)的流模式。内部使用ComfyUI WebSocket(/ws)而不是历史民意调查。

例子:

curl -N -X POST http://127.0.0.1:8099/generate/stream \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_path": "text2img.template.json",
    "inputs": {
      "prompt": "a cinematic photo of a red fox in snow",
      "negative_prompt": "blurry, low quality",
      "checkpoint": "v1-5-pruned-emaonly.safetensors",
      "seed": 123456789,
      "steps": 25,
      "cfg": 7.5,
      "width": 768,
      "height": 768,
      "filename_prefix": "lmstudio"
    },
    "timeout_sec": 240
  }'

SSE事件类型:

  • submitted
  • progress
  • completed
  • error

为了 /generate/stream, timeout_sec 是一个不活动超时:只有在此期间没有流更新到达时,请求才会停止。

POST /submit + POST /result/{prompt_id}

两步异步流:

  1. 提交并获取 prompt_id.
  2. 当你的代理人准备好了,等待结果。

模板占位符

任何完全匹配的字符串值 {{name}} 被替换为 inputs.name.

例子:

{
  "text": "{{prompt}}",
  "width": "{{width}}"
}

如果中缺少占位符 inputs,API返回 400.

LM工作室/代理集成

添加一个HTTP工具/操作,调用:

  • POST http://127.0.0.1:8099/generate

工具输入模式可以是:

{
  "type": "object",
  "properties": {
    "workflow_path": { "type": "string" },
    "inputs": { "type": "object" },
    "timeout_sec": { "type": "integer", "default": 180 }
  },
  "required": ["workflow_path", "inputs"]
}

由于此服务公开了OpenAPI,许多框架可以直接从以下位置导入工具规范:

MCP服务器(为简单起见,建议使用)

此回购还包括一个MCP服务器,该服务器使用与HTTP API相同的共享核心:

  • $PROJECT_ROOT/mcp_server.py
  • 暴露的MCP工具:
  • comfy_generate
  • comfy_generate_stream
  • comfy_list_workflows
  • comfy_required_inputs

comfy_required_inputs 返回两者 required_inputs 和 required_input_details (name + description). comfy_generate_stream 发出实时MCP进度通知(针对支持进度令牌的客户端)并返回最终工件。

运行MCP服务器

cd $PROJECT_ROOT
source .venv/bin/activate
pip install -r requirements.txt
export COMFYUI_BASE_URL=http://127.0.0.1:8188
export WORKFLOW_ROOT=./workflows
python mcp_server.py

LM Studio MCP配置(标准输入)

在LM Studio中添加指向以下内容的MCP服务器条目:

  • 命令: python
  • args: ["$PROJECT_ROOT/mcp_server.py"]
  • 环境:
  • COMFYUI_BASE_URL=http://127.0.0.1:8188
  • WORKFLOW_ROOT=$PROJECT_ROOT/workflows

示例呼叫有效载荷 comfy_generate:

{
  "workflow_path": "text2img.template.json",
  "inputs": {
    "prompt": "an ultra-detailed mountain landscape at sunrise",
    "negative_prompt": "blurry, low quality",
    "checkpoint": "v1-5-pruned-emaonly.safetensors",
    "seed": 987654321,
    "steps": 25,
    "cfg": 7.5,
    "width": 768,
    "height": 768,
    "filename_prefix": "lmstudio_mcp"
  },
  "timeout_sec": 240,
  "poll_interval_sec": 1.0
}

备注

  • workflow_path 仅限于以下文件 WORKFLOW_ROOT.
  • url 值指向ComfyUI /view 端点,因此运行代理的同一主机应能访问ComfyUI。