2026年10月22日 星期四

在 ChatGPT Codex 中設定 Comfy MCP

到 Codex 選 Setting -> Plugins -> Add MCP servers
各欄輸入如下
Mame (可自取): Comfy MCP
Type: STDIO

Command to launch (填入電腦裡安裝的 uvx 路徑): C:\Users\HugoKuo\AppData\Local\Programs\Python\Python312\Scripts\uvx Arguments (設定如下,配合 Command to launch 的設定等同於 Codex 會執行 uvx --with comfy-cli>=1.14.0 comfy-mcp): --with comfy-cli>=1.14.0 comfy-mcp Environment variables (填入你 local 端 run 起來的 ComfyUI 端點) : COMFY_LOCAL_URL = http://127.0.0.1:8188



Ollama AI 筆記 - 整合 Ollama AI, Open Web UI, MCP, MCPO, Stable Difussion, ComfyUI, Docker Compose

------------------------- WSL 設定安裝 Nvidia Container Toolkit -----------

# Windows 可在 WSL 上安裝 Nvidia Container Toolkit 讓 Docker container 可以使用 GPU 加速,參考 ollama/ollama - Docker Image 的 Nvidia GPU 部份

#設定 Repository

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
    | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
    | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
    | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update

#安裝 Nvidia Container Toolkit

sudo apt-get install -y nvidia-container-toolkit

#安裝完 Nvidia Container Toolkit 後可能會需要重新啟動 Docker

service docker restart
//或
systemctl restart docker

-----------------------------------------------------------------------------------

#可用 Docker 安裝 Ollama,例如 Docker compose 如下範例,啟動方:
docker-compose.yml :

volumes: 
    ollama-volume:
    open-webui-volume:
services:
    #有設定 profile,啟動方式例如 docker compose --profile <profile name> up -d,
    #例 docker compose --profile service up -d
    ollama:
        image: curl -fsSL https://ollama.com/install.sh | sh:0.32.15
        container_name: ollama/ollama:0.32.15
        restart: unless-stopped
        profiles: [service]
        volumes:
            - ollama-volume:/root/.ollama
        ports:
            - "11434:11434"
        environment:
            #可依需求自行調整 OLLAMA_CONTEXT_LENGTH
            #太小可能會造成 context 被截斷 AI 無成正確回應,例如AI應該要找到並使用 MCP Tool 但卻回找不到 Tool 可用
            - OLLAMA_CONTEXT_LENGTH=8192
        #讓 container 使用 GPU,等同 docker run 的 --gpus=all 參數
        deploy:
            resources:
                reservations:
                    devices:
                        - driver: nvidia
                          count: all
                          capabilities: [gpu]
        logging:
            driver: "json-file"
            options:
                max-size: "1k"
                max-file: "3" 

    #除了直接用 CLI command, HTTP, Node JS, Python... 等使用 Ollama
    #也可撘配 Open Web UI 用瀏覽器使用 Ollama
    open-webui:
        image: ghcr.io/open-webui/open-webui:main
        container_name: open-webui
        restart: unless-stopped
        profiles: [service]
        ports:
            - "3001:8080"
        volumes:
            - open-webui-volume:/app/backend/data
        environment:            
            - OLLAMA_BASE_URL=http://ollama:11434
            # 如果 Ollama 是直接另外 run 在 host 宿主機上的話 
            #(如果沒有寫在 docker compose 裡所以得不到 ollama domain 的話),
            # 也可設定 extra_hosts 然後設定 OLLAMA_BASE_URL 如下
            #- OLLAMA_BASE_URL=http://host.docker.internal:11434
        #extra_hosts:
        #    - "host.docker.internal:host-gateway"
        depends_on:
            - ollama
    
    # 使用 mcpo 將本地使用 stdio 的 mcp server 包成 Open Web UI 支援的 Open API endpoint
    mcp-server:
        image: ghcr.io/open-webui/mcpo:main
        container_name: mcp-server
        restart: unless-stopped
        ports:
            - "8000:8000"
        profiles: [service]
        volumes:
            - ./mcp-server:/mcp-server
        command:
            - --config
            - /mcp-server/config.json
              
    # ComfyUI 是底層使用 AI 繪圖 Stable Difussion 的一種介面實現
    comfyui:
        image: ghcr.io/lecode-official/comfyui-docker:0.6.3-comfyui-0.8.2-comfyui-manager-4.0.5-pytorch-2.9.1-cuda-12.6-cudnn-9
        container_name: comfyui
        restart: unless-stopped
        profiles: [service]
        ports:
            - "8188:8188"
        volumes:
            - ./comfyui/models:/opt/comfyui/models
            - ./comfyui/output:/opt/comfyui/output
            - ./comfyui/custom_nodes:/opt/comfyui/custom_nodes
            - ./comfyui/workflows:/opt/comfyui/user/default/workflows
        deploy:
            resources:
                reservations:
                    devices:
                        - driver: nvidia
                          count: all
                          capabilities: [gpu]
    
    #備分 docker volume 使可使用
    #可執行 sudo docker compose --profile backup_volume run --rm backup_volume
    backup_volume:
        image: alpine:3.23.3
        container_name: backup_volume
        profiles: [backup_volume]
        volumes:
            - ollama-volume:/usr/local/ollama-volume
            - open-webui-volume:/usr/local/open-webui-volume
            - ./backup_volume:/usr/local/backup_volume
        command:
            - sh
            - -c
            - |
                tar -cvf /usr/local/backup_volume/ollama-volume.tar -C /usr/local ollama-volume
                tar -cvf /usr/local/backup_volume/open-webui-volume.tar -C /usr/local open-webui-volume
    
    #還原備分 docker volume 使可使用
    #可執行 sudo docker compose --profile restore_volume run --rm restore_volume
    restore_volume:
        image: alpine:3.23.3
        container_name: restore_volume
        profiles: [restore_volume]
        volumes:
            - ollama-volume:/usr/local/ollama-volume
            - open-webui-volume:/usr/local/open-webui-volume
            - ./backup_volume:/usr/local/backup_volume
        command:
            - sh
            - -c
            - |
                tar -xvf /usr/local/backup_volume/ollama-volume.tar -C /usr/local
                tar -xvf /usr/local/backup_volume/open-webui-volume.tar -C /usr/local         

/mcp-server/config.json (mcpo 的 mcp config,可以自行放入多個想要設定的 MCP server),這裡的例子放了 fetch (可抓取網頁內容) 和 chrome-devtools (實際上可能 docker container 裡面還要裝 chrome 及一些設定才能使用):

{
  "mcpServers": {
	"fetch": {
	  "command": "uvx",
	  "args": ["mcp-server-fetch"]
	},	
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp@latest"]
    }
  }
}

--------------------  常用指令 ------------------
#進入 Ollama 互動介面 menu,畫面如下所示

ollama

Ollama 互動模式的選單畫面
跟 AI 問答的樣子:


#如果 Ollama 沒有被啟動,可用指令手動啟動
ollama serve

#下載安裝模型 model
#官方模型列表
ollama pull <model name>
#例如:
ollama pull gemma4:e4b

#模型下載列表
https://ollama.com/search

#運行模型 (模型沒下載會自行下載),進行 chat
ollama run <model name>
#例如:
ollama run gemma4

#列出模型
ollama list

#刪除模型
ollama rm <model name>

# 也可使用 http 呼叫,例如:

curl http://localhost:11434/api/generate -d '{
  "model": "gemma4",
  "prompt": "Why is the sky blue?",
  "stream": false
}'

# 也可使用 Node JS, Python Library 呼叫
# 以 Node JS 為例,先 npm install ollama 安裝 package 後,執行如下

一般的非 Streaming 回答:

import ollama from 'ollama'
//一般的非 Streaming 回答
const response = await ollama.chat({
  model: 'gemma4:e4b',
  messages: [{ role: 'user', content: 'Why is the sky blue?' }],
})
console.log(response.message.content);

Streaming 回答:

import ollama from 'ollama'
//Streaming 回答
const message = { role: 'user', content: 'Why is the sky blue?' }
const response = await ollama.chat({
  model: 'gemma4:e4b',
  messages: [message],
  stream: true,
})
for await (const part of response) {
  process.stdout.write(part.message.content)
}

---------------------------- 與 Open Web UI 的搭配使用 ------------------

參考上方的 docker-compose.yml ,
使用 docker compose up -d 指令把 Ollama 和 Open Web UI 啟動起來後,
就可以用瀏覽器用下面網址進到 Open Web UI 介面去使用 Ollama
http://localhost:3001


Open WebUI 的 num_ctx 會覆蓋掉 Ollama 自己設定的 OLLAMA_CONTEXT_LENGTH,可依需求到 Settings -> Models -> Advanced Params -> num_ctx (Ollama) 設定 context length 修改




---------------------------- Open Web UI 與 MCPO 搭配使用 ------------------
Open Web UI 支援 Open AI 型式去連接 MCP Server,
如果我們本地端的 MCP Server 是走 Stdio 的話,
可以使用 MCPO 去把本地 MCP Server 包裝成 Open API 型式,
使用方式可參考上述的 docker-compose.yml 和 /mcp-server/config.json,
啟動好 MCPO Server 後,我們就可以用
http://localhost:8000/docs
觀看 MCP 的 Open API document 文件。

Open Web UI 的部份則要如下設定使用 MCP tool (AI Model 也要支持使用 tool 才行,例如 gemma 就行)。
  1. Settings -> Models -> 選擇 Model -> Advance Params -> Function Calling 選 Native (雖然它寫 Default 是 Native,但實測發現要選 Native MCP tool 才會被使用,可能是 bug ?)。
  2. Settings 的 Tools 區塊 -> Integrations -> 在 External Tool Servers 按 + 號 (Add connection) 加入新的 MCP tool,Name 可自己取,url 填 MCP 的 endpoint,例如 http://mcp-server:8000/fetch
  3. Settings -> Models -> 選擇 Model -> Tools 按 Select Tool 勾選要用的 MCP tool
  4. 跟 AI聊天的地方就可以看到可用的 MCP Tool 顯示在 Avaliable Tools 了
  5. 以下是跟 AI 聊天時使用了 fetch 這個 MCP tool 的畫面
---------------------------- Open Web UI 與 ComfyUI 搭配使用以文生圖 ------------------
ComfyUI 是底層使用 Stable Difussion AI 繪圖的 UI 介面,
使用串接各種 Node 的 input/ouput 的 workflow 方式來使用 Stable Difussion 進行 AI 繪圖,
docker 的配置可參考上述的 docker-compose.yml,
啟動 docker container 後,
可用
http://localhost:8188
進入 ComfyUI 的介面如下,範例為最基礎的文生圖 flow:


 
#可下載繪圖 Model 的地方
Civitai (主要以AI繪圖為主) : https://civitai.com/
Hugging Face (不只AI繪圖,也有其他種類的 AI Model) : https://huggingface.co/

#可以安裝 ComfyUI Manager custom node,提供了更多更細的設定功能,
例如顯示各 node 的 id
ComfyUI Manager 的 Git: ComfyUI Manger Git 
安裝方式可到 ComfyUI 的 custom_nodes 資料夾執行以下 git clone 指令即可
git clone https://github.com/ltdrdata/ComfyUI-Manager comfyui-manager

#可在設定中開啟各 node 的 id,之後方便跟 Open Web UI 整合,如下所示:

#將 ComfyUI 整合到 Open Web UI 的方式,
可參考 Open WebUI連接Stable Diffusion生成圖片,讓AI指揮AI繪圖 · Ivon的部落格
先在 ComfyUI 設計好繪圖的 flow,用 File -> Export (API) 把它導出成 API 用的 JSON 檔,
在 JSON 檔中可以看到各 ComfyUI node 的 id,如果有開啟如上述的 "顯示 node ID 的話",
可以直接從 Flow Graph 中看到各 Node 的 ID。


到 Settings -> Images 把 Image Generation 的勾選打開,
Image Generation Engine 選 ComfyUI。

填入要用的 Model,必須是 ComfyUI 中有安裝的 Model,
不用是 ComfyUI Flow Graph 中使用的 Model,
所填的 Model 等下會帶入 ComfyUI flow 的 Load Checkpoint node 中。

填入 Image Size,例如 512x512。
填入 Steps,例如 20。
Base URL 填入 ComfyUI 的 endpoint,例如 http://comfyui:8188

按下 ComfyUI Workflow 的 Import 導入剛剛從 ComfyUI 導出的 JSON 檔。
在 ComfyUI Workflow Nodes 中填入各 Prompt 對應到 ComfyUI 中的 node ID,
各 Prompt 對應的 ComfyUI node 如下:
text : 就是 CLIP Text Encode (Prompt) node。
Model : 就是 Load Checkpoint node。
Width, Height : 就是 Empty Latent Image。
Steps, Seed : 就是 KSampler

最後按下 Save 儲存設定,上述設定說明可參考下圖。



接著回到 Open Web UI 的聊天處,把 Image 勾選起來,
就可以在對話中開始要求 AI 生圖了,如下圖範例,Prompt 參考:
產生一張如下描述的圖片,請先將描述轉換成適合 Stable Difussion 的 英文 Prompt, 再用 Prompt 來產生圖片:
一隻狗在河裡遊泳