Skip to main content
Glama

comfyui-mcp — drive ComfyUI with ANY LLM

The local-first, agent-native control plane for ComfyUI. An MCP server plus a live sidebar agent that generates images, video and audio, authors and runs workflows, manages models and custom nodes, and edits your live ComfyUI graph in natural language. Bring whatever model you have: Claude or ChatGPT on your subscription, Gemini on your Google login, a free local model via Ollama (fully offline), or any hosted model over one API key (DeepSeek, GLM, MiMo, Kimi, GPT, Claude via OpenRouter). The tools and the panel are the same on every tier, and the built-in LLM Arena scores each model on real ComfyUI tasks so you know what yours can do. One config targets local installs, LAN, VPS, or Comfy Cloud.

npm version Node.js License Documentation

comfyui-mcp MCP server comfyui-mcp MCP server

Deploy on RunPod Join the Discord  One-click GPU pod. A ready-to-run ComfyUI with this project + Agent Panel + ComfyUI-Manager v2 preinstalled, on your own GPU. No setup.

Works on macOS, Linux, and Windows. Auto-detects your ComfyUI installation and port.

Stuck or have a question? Join the Discord for help, model tips, and release announcements.

38 MCP tools | 42 AI skills (Flux · WAN · LTX 2.3 video · MiniMax H3 · Qwen · Z-Image · Ideogram 4 · ERNIE · ANIMA · model registry · Civitai · node authoring · launch/perf flags) | 56 installer packs | 11 slash commands | 4 autonomous agents | 3 hooks

The plugin ships skills that grow with every release: model-specific generation guides with curated download URLs, workflow recipes, troubleshooting, and custom-node authoring. With them, Claude knows the right sampler, CFG, resolution, and model files for each architecture without trial and error.

Now available: the ComfyUI Agent Panel on ComfyUI-Manager & the Comfy Registry

An autonomous AI agent in your ComfyUI sidebar, running on Claude, ChatGPT, Gemini, or ANY local/hosted LLM (Ollama and every OpenAI-compatible endpoint). Subscriptions work with no API key; local models work with no account at all. Pick a provider and it drives your live graph: edits, spatial layout, one-shot workflow/pack loads, rewind/rollback, a pending-message tray, activity cards, multi-tab. It asks before spending paid API credits. Search comfyui-agent-panel in ComfyUI-Manager to install. Read more →

Full documentation: comfyui-mcp.artokun.io/docs


Quick Start

1. Install ComfyUI (if you haven't already): ComfyUI Desktop or from source

2. Add the MCP server to your Claude Code config (~/.claude/settings.json):

{
  "mcpServers": {
    "comfyui": {
      "command": "npx",
      "args": ["-y", "comfyui-mcp"],
      "env": {
        "CIVITAI_API_TOKEN": ""
      }
    }
  }
}

3. Start using it. With ComfyUI running, ask Claude to generate an image:

> Generate an image of a sunset over mountains

Claude will find (or download) a checkpoint, build a workflow, execute it, and return the image.

Note: This runs as a standalone MCP server, so there is no need to clone this repo. npx downloads and runs it.

Scope: local, remote, or Comfy Cloud

comfyui-mcp is local-first. A self-hosted ComfyUI on Mac/Linux/Windows is the primary target, and the same agent reaches remote installs (RunPod, VPS, LAN, reverse-proxied) from one config. Local-first, not local-only.

More than a bridge. Most ComfyUI MCP servers are thin connectors. They forward a prompt and hand back an image. comfyui-mcp is a full control plane. It authors and edits the graph node by node, runs and iterates on workflows, manages models and custom nodes, and ships model-specific expertise (samplers, CFG, resolutions, curated model URLs) so the agent gets it right without trial and error. If you want a minimal local relay, a lightweight server is fine. If you want an agent that operates ComfyUI, that's this project.

For Comfy Cloud users, Comfy-Org ships its own agent tooling: Comfy Cloud MCP (public beta, hosted on Comfy Cloud GPUs), the Comfy In-App Agent (private alpha, inside Comfy Cloud), and a first-party Comfy Local MCP (private test, not publicly available yet), all maintained by the Comfy team. If you don't have a GPU or you want zero setup, that's the better path; go use it.

Where this project differs is that it runs on your install and your choice of model, including a free local one via Ollama with no account and no network at all. comfyui-mcp also includes a community cloud mode (set COMFYUI_API_KEY, see Deployment modes) so a single MCP can target all three deployment shapes from one config.

Local vs. Comfy Cloud agent is a side-by-side comparison, including when Comfy Cloud is the right answer. (Statuses above are as of July 2026. Comfy-Org ships fast, so check their docs for the current state.)

Remote / hosted connector (one command)

To use comfyui-mcp from Claude Desktop's Custom Connectors or any remote client, like Comfy's own cloud.comfy.org/mcp connector, run it as an authenticated, publicly reachable Streamable-HTTP server with one flag:

npx -y comfyui-mcp@latest --tunnel

This forces the HTTP transport, generates an auth token, opens a cloudflared quick tunnel, and prints a ready-to-paste https://…/mcp URL + token + Claude Desktop connector snippet. Auth accepts Authorization: Bearer <token> or X-API-Key: <token> (matching Comfy Cloud's convention). See the Remote / hosted connector guide for the full walkthrough and headless usage.

Auth is opt-in. With no COMFYUI_MCP_HTTP_TOKEN set and no --tunnel, the default stdio (and plain --http on loopback) behavior is unchanged. It stays open and local. OAuth (Comfy's browser sign-in flow) is a planned follow-up.


Related MCP server: ComfyUI-APP-MCP

Claude Code Plugin

This package also ships as a Claude Code plugin that adds slash commands, skills, agents, and hooks on top of the MCP tools.

Install as a plugin

# In Claude Code
/plugin marketplace add artokun/comfyui-mcp
/plugin install comfy

Slash commands

Command

Description

/comfy:gen <prompt>

Generate an image from a text description — auto-selects checkpoint, builds workflow, returns image

/comfy:viz <workflow>

Visualize a workflow as a Mermaid diagram with nodes grouped by category

/comfy:node-skill <pack>

Generate a Claude skill for a custom node pack from Registry ID or GitHub URL

/comfy:debug [prompt_id]

Diagnose why a workflow failed — reads history, logs, traces root cause, suggests fixes

/comfy:batch <prompt, params>

Parameter sweep generation across cfg, sampler, steps, seed, etc.

/comfy:convert <file>

Convert between UI format and API format workflows

/comfy:install <pack>

Install a custom node pack — git clone, pip install, optional restart

/comfy:gallery [filter]

Browse generated outputs with metadata — filter by date, count, or filename

/comfy:compare <a vs b>

Diff two workflows side by side — shows added/removed nodes and changed parameters

/comfy:recipe <name> <prompt>

Multi-step recipes: portrait, hires-fix, style-transfer, product-shot

Built-in skills

42 skills total: model-family guides (Flux, WAN, LTX 2.3, MiniMax H3, Qwen, Z-Image, Ideogram 4, ERNIE, ANIMA + anime / WAN / Z-Image LoRA training), the model-registry (curated download URLs), the civitai pairing skill, node authoring, the launch/performance-flags matrix, and the core four below. Full list on the plugin docs page.

Installer packs. packs/ bundles 13 one-command ComfyUI setups: ANIMA, Ideogram 4, LTX-2.3, ERNIE, WAN (animate / longer-videos / transparent), Qwen (image / image-edit), Z-Image (turbo / base / xy-plot) and artokun-flow (WAN Animate: replace / animate). Each is a manifest of custom nodes + model URLs + workflow that drives both apply_manifest and generated install-windows.bat / install-runpod.sh, with CI that validates every model link + payload size. See packs/README.md.

Skill

Description

comfyui-core

Workflow format, node types, data flow patterns, pipeline architecture, MCP tool usage guide

prompt-engineering

CLIP weight syntax (word:1.3), BREAK tokens, embeddings, model-specific prompting for SD1.5/SDXL/Flux/SD3

troubleshooting

Common error catalog — OOM, dtype mismatches, missing nodes, NaN tensors, black images, CUDA errors, with VRAM estimates per model

model-compatibility

Compatibility matrix — loaders, resolutions, CFG, samplers, ControlNets, LoRAs, and VAEs per model family (SD1.5/SDXL/Turbo/Lightning/Flux/SD3/LTXV)

Agents

Agent

Model

Description

comfy-explorer

Sonnet

Researches custom node packs — reads docs, queries /object_info, generates skill files

comfy-debugger

Sonnet

Autonomously diagnoses workflow failures — gathers logs + history, identifies failing node, checks models + custom nodes, proposes and optionally applies fixes

comfy-optimizer

Sonnet

Analyzes workflows for performance — detects redundant nodes, VRAM waste, wrong CFG/steps for model family, precision issues, suggests optimizations

comfy-researcher

Sonnet

Discovers and ranks ComfyUI custom node packs for a stated image-generation problem

Hooks

Event

Trigger

Action

PreToolUse

enqueue_workflow

VRAM watchdog — checks GPU memory via /system_stats and warns if < 1GB free before execution

PreToolUse

restart_comfyui (actions stop/restart)

Save warning — prompts user to save unsaved workflow changes before stopping ComfyUI

PostToolUse

Any comfyui tool

Job completion notify — checks for completed jobs and injects completion summaries into the conversation

Background Scripts

Script

Description

monitor-progress.mjs

Progress monitor — connects to ComfyUI's WebSocket for real-time step progress (e.g., step 5/14 (36%)). Run as a background Bash task after enqueuing workflows. Reports completion with output filenames, errors with node details. Replaces polling queue (action:"status") in a loop.


Panel agent (Claude · ChatGPT · Gemini · any local/hosted LLM)

Beyond the headless MCP server, this package ships the panel orchestrator that powers the ComfyUI Agent Panel, an autonomous agent embedded in ComfyUI's sidebar that drives the live canvas. It runs in the background on your own subscription (Claude or ChatGPT), started on demand by the panel's Connect button:

npx -y comfyui-mcp@latest connect

Drive a REMOTE ComfyUI from your own machine (connect)

When ComfyUI runs somewhere with no Node or agent (a RunPod pod, a cloud box) you can still run the agent on your machine and drive that remote ComfyUI. There is no agent login on the box and nothing to install or configure remotely:

npx -y comfyui-mcp@latest connect https://abcd1234-3000.proxy.runpod.net

This is sugar for --panel-orchestrator with COMFYUI_URL set from the URL. The orchestrator runs locally on your Claude/ChatGPT login and reaches the remote ComfyUI over its public proxy URL. For a remote HTTPS pod, connect opens a token-gated wss:// tunnel (via Cloudflare) to the local agent bridge and hands the pod's panel that URL, so the pod's HTTPS page reaches your machine with no browser prompt, in any browser. A secure page can't open a plain ws:// socket to your box because of mixed-content and Private Network Access rules. A local ComfyUI uses the plain ws://127.0.0.1:9199 loopback bridge. Add --insecure-bridge to force that loopback for a remote pod, then arrange your own path to it, e.g. an SSH port-forward. Either way the panel JS runs in your local browser, and the agent and your login run only on your machine, so nothing is installed remotely.

To finish, with connect still running on your machine, open the remote ComfyUI in your browser and click Connect in the Agent panel. The panel is a pure-frontend extension. It links to the bridge your connect process is already serving, rather than asking the ComfyUI host to spawn an orchestrator it cannot run.

Multi-provider, full parity. The orchestrator depends on a provider-neutral AgentBackend port (dependency injection), with two adapters:

  • ClaudeBackend wraps the Claude Agent SDK (@anthropic-ai/claude-agent-sdk), a persistent streaming session over the claude.ai subscription (OAuth, no key).

  • CodexBackend wraps OpenAI Codex over the codex app-server JSON-RPC protocol (@openai/codex), on the ChatGPT subscription (codex login, no key).

Further adapters follow the same port: Gemini CLI (ACP), Antigravity (agy, the Google AI Pro/Ultra subscription path; install from antigravity.google and run agy once to sign in), Grok, Kimi, GLM, Ollama/LM Studio/llama.cpp (local), OpenRouter, and any OpenAI-compatible endpoint. See docs/backends for the full matrix.

Both are optional dependencies, and the panel picks a provider, not a port. Each backend runs its own orchestrator on its own loopback bridge port. A capability matrix tells the panel which features each backend supports (e.g. conversation-rollback is Claude-only today, since the Codex app-server resumes whole threads only).

The live-canvas tools and model knowledge are identical across providers. The panel_* tool definitions live in one shared list, registered onto both the in-process Claude SDK MCP server and a @modelcontextprotocol/sdk server over a loopback streamable-HTTP MCP that the orchestrator hosts for Codex (which can only host config-declared MCP servers). The headless comfyui MCP is likewise injected into both, in-process for Claude and declared via codex app-server -c mcp_servers for ChatGPT, so generation, models, and workflow tools are the same everywhere.

New tools that give every backend the same expertise and a cost guardrail:

Tool

Description

list_packs (action: "skill_list" / "skill_read")

Discover and read bundled model-family + workflow skills — the knowledge Claude loads natively, exposed to any MCP client (e.g. the Codex backend)

list_packs (action: "list" / "read_workflow")

List one-command installer packs (custom nodes + weights + ready workflow; all local-GPU / free) and read a pack's graph

list_packs (action: "list_templates")

List the connected ComfyUI's custom-node-contributed workflow templates

list_packs (action: "check_runtime")

Classify a workflow as local (your GPU, free) or api / mixed / unknown (hosted API nodes = paid credits) so the agent asks before spending paid API credits

list_packs (action: "extract_deps" / "install_deps")

Work out which custom node packs a workflow needs, and install the missing ones through ComfyUI-Manager

panel_load_workflow

(panel tool) Load a full workflow onto the live canvas in one shot — by bundled pack name (read server-side, never shuttled through chat) or by graph JSON

panel_strip_workflow / panel_slice_workflow

(panel tools) De-virtualize a tangled graph (Get/Set buses, Reroutes, subgraphs, bypass → real connections) or carve one rgthree-toggled pipeline out of a monolith — by pack, server-side path, or inline graph; for understanding/rebuilding expert workflows without hand-tracing

See the design doc, design/agent-backend-injection.md, for the port, the capability matrix, and the per-provider "clink" points, and the panel docs for the full sidebar UX.


MCP Tools

38 tools across workflow execution, generation, iteration, composition, models, and more:

Image Generation (high-level)

Tool

Description

generate_image action: "image"

Generate from a text prompt — builds a txt2img workflow, fills unspecified params from your defaults, auto-selects a checkpoint

generate_image action: "controlnet"

Generate conditioned by a ControlNet image (pose/depth/canny/normal) + prompt

generate_image action: "ip_adapter"

Generate guided by a reference image's style/subject via IP-Adapter (needs ComfyUI_IPAdapter_plus)

generate_image action: "video" / "3d"

Generate a short video clip (LTX-2.3, local GPU) or a 3D model (hosted partner API nodes) from the same one-line entry point

generate_image action: "upscale"

Post-process an uploaded or staged image with ESRGAN super-resolution

generate_image (action:"remove_background")

Post-process an uploaded or staged image into a transparent BiRefNet cutout

Audio Generation (high-level)

Tool

Description

generate_image action: "audio"

Generate audio from a text prompt — supports ACE Step 1.5 (music with lyrics/structure) and Stable Audio 3 (music, instruments, SFX); auto-selects local models

Assets & Iteration

Tool

Description

get_image (action:"view")

Return a generated asset's bytes as an inline image so the agent can see the result

get_image (action:"analyze_color")

Palette / contrast / color statistics for a generated image (dominant colors, average + luminance stats, contrast checks) so the agent can reason about color without a vision round-trip

generate_image (action:"regenerate")

Re-run the workflow that produced an asset_id, with optional parameter overrides

get_image (action:"list_assets")

Browse recently generated assets (newest-first) by asset_id

get_image (action:"asset_metadata")

Full provenance for an asset, including the originating workflow

Defaults

Tool

Description

get_defaults action:"get"

Show merged generation defaults with per-source attribution

get_defaults action:"set"

Update runtime defaults; persist: true writes the config file

get_defaults action:"get_ui" / action:"set_ui"

Read/write ComfyUI's OWN frontend UI settings (the Comfy.* ids) — a separate store from the generation defaults above

Workflow Execution

Tool

Description

enqueue_workflow action: "enqueue"

Submit a workflow (API format JSON) — returns prompt_id immediately, non-blocking

enqueue_workflow action: "rerun" / "run_url" / "template_schema"

Re-run a past generation, or read/run a shared workflow from a URL, or inspect a bundled template's overridable slots

enqueue_workflow (action:"run_template")

One-shot: resolve a bundled pack's expert graph, apply <nodeId>.<widget> overrides, and enqueue it

queue

One action-parameterized tool for the execution queue: list (running + pending), status (one job by prompt ID), get_workflow (a pending job's full payload), move/edit (requeue a pending job front/back, patched or replaced, with a new prompt ID), cancel (interrupt the running job — escalates interrupt → verify → /free, reports WEDGED if it won't die; clear_pending: true also drops all pending), cancel_queued, clear

get_system_stats

Get system info — GPU, VRAM, Python version, OS

Workflow Visualization

Tool

Description

visualize_workflow

One action-parameterized tool for rendering and converting a workflow you pass in: render (Mermaid flowchart, nodes grouped by category), render_hierarchical (the same graph sectioned — overview, one section in detail, a listing, or an AI-oriented summary), mermaid (a Mermaid diagram back to executable workflow JSON), to_dsl/from_dsl (the compact, losslessly round-tripping authoring DSL)

Workflow Composition

Tool

Description

create_workflow

One action-parameterized tool for authoring: create (from templates: txt2img, img2img, upscale, inpaint, controlnet, ip_adapter, ace_step_15, stable_audio_3), modify (operations: set_input, add_node, remove_node, connect, insert_between), validate (dry-run — missing nodes, broken connections, invalid output indices, missing model files), node_info (query available node types from ComfyUI's /object_info endpoint)

Workflow Library

Tool

Description

get_workflow

One action-parameterized tool for READING a saved workflow file: list (the user library, subfolders included), get (one workflow's JSON by filename), analyze (a structured summary instead of raw JSON), query (filter/traverse/aggregate a big graph without dumping it), strip (de-virtualize any workflow from an absolute path, library filename, or inline graph — resolve GetNode/SetNode buses, Reroutes, subgraph defs, and bypassed nodes into real connections and return the flat graph; reads ANY path server-side, so it loads ad-hoc/expert workflows the cached library can't), slice (un-chunk a toggle-template monolith — one rgthree Fast-Groups-Bypass-toggled pipeline out into a standalone activated graph; pair with strip to then flatten the buses), from_image (the workflow ComfyUI embedded in a PNG), prompt_director (Prompt Director's sanitized runtime state)

save_workflow

One action-parameterized tool for WRITING to the library: save (store a workflow — overwrites a same-filename file), lock (record a provenance lock: SHA-256 per model, git commit per node pack), verify_lock (report drift against that lock)

Image Management

Tool

Description

upload_image

Copy a local image into ComfyUI's input/ directory for img2img, inpaint, or ControlNet

get_image (action:"list_outputs")

Browse recently generated images and videos from the output directory, sorted newest-first — recurses into subfolders (e.g. SaveVideo's output/video/…) and returns each result's subfolder

Model Management

Tool

Description

download_model

Find and fetch model weights, and track the transfers. action: download (from a URL, into the correct ComfyUI subdirectory), status, cancel, search (HuggingFace), search_civitai, search_creators, download_civitai, resolve_missing

list_local_models

What is installed, and where ComfyUI looks. action: list (installed models by type: checkpoints, loras, vae, upscale_models, controlnet, embeddings, clip, unet, diffusion_models, text_encoders), remove (deletes a model file), embeddings, list_paths, add_path, remove_path (the last three view/edit the extra search-path YAML)

Memory Management

Tool

Description

clear_vram

Free GPU VRAM by unloading cached models — calls ComfyUI's /free endpoint, reports before/after stats

Registry & Discovery

Tool

Description

search_custom_nodes

Search the ComfyUI Registry for node packs by keyword (action: "search"), or get one pack's full details (action: "details")

list_packs (action: "generate_skill")

Generate a Claude skill .md file from a Registry ID or GitHub URL

comfy_cli

Search actual loaded node classes through official comfy nodes search (action:"search_nodes")

Official comfy-cli

Install comfy-cli 1.11.1 or newer to enable the official JSON-backed tools. The MCP resolves comfy from COMFY_CLI_PATH, PATH, or the selected workspace's .venv/venv. Local custom-node operations prefer comfy node when a supported CLI is available and otherwise fall back to Manager HTTP; remote targets keep using Manager HTTP.

Tool

Description

comfy_cli

One action-parameterized tool for the whole official CLI: status, server_start/server_stop/server_restart, jobs_list/jobs_status/jobs_wait/jobs_watch/jobs_cancel, search_nodes, workflow_validate/workflow_run, transfer_upload/transfer_download, models_* (list/search/show/download/remove), skills_* (list/show/validate/install/status/uninstall)

Diagnostics

Tool

Description

get_system_stats (action:"logs")

Get ComfyUI server logs with optional keyword filter (e.g., error, warning, a node name)

kitchen

See what comfy-kitchen can do on this GPU (status), find where a graph leaves it on the table (assess), and apply the faster path (apply) — a failed probe is unknown, never a no

get_history action: "list"

Get execution history with full error details, Python tracebacks, timing, and cached node info

get_history action: "diagnose"

Explain a FAILED run in one call — the failed node and traceback PLUS the missing models (file + widget) and missing node types

Process Control

Tool

Description

restart_comfyui action:"restart"

Stop and restart ComfyUI, preserving all launch arguments

restart_comfyui action:"stop"

Stop the running ComfyUI process (saves PID and launch args for restart)

restart_comfyui action:"start"

Start ComfyUI using info saved from a previous stop

Generation Tracker

Tool

Description

get_history action: "suggest"

Suggest proven sampler/scheduler/steps/CFG settings from local generation history — query by model family, LoRA hash, or text search

get_history action: "stats"

Show local generation tracking statistics — total runs, unique combos, breakdown by model family

Every enqueue_workflow call logs settings to a local SQLite database (generations.db). Repeated settings combos get a reuse_count bump instead of a duplicate row, so the count works as a popularity signal. The tracker identifies models and LoRAs by content hash (AutoV2 / SHA256), not filename, so renamed files still group together.

# View local stats from the CLI
npm run generations:stats

Examples

Generate an image

> /comfy:gen a cyberpunk city at night with neon lights

Claude will:

  1. Check installed checkpoints (download one if needed)

  2. Build a txt2img workflow with your prompt

  3. Execute it on ComfyUI

  4. Return the generated image

Visualize a workflow

> /comfy:viz ~/workflows/my-workflow.json

Produces a Mermaid diagram with nodes grouped by category:

flowchart LR
  subgraph Loaders
    1["CheckpointLoaderSimple"]
  end
  subgraph Conditioning
    2(["Positive Prompt"])
    3(["Negative Prompt"])
  end
  subgraph Sampling
    5{{"KSampler<br/>steps:20 cfg:8"}}
  end
  1 -->|MODEL| 5
  2 -->|CONDITIONING| 5
  3 -->|CONDITIONING| 5

Debug a failed workflow

> /comfy:debug

Reads the last execution history and logs, identifies the failing node, checks for missing models or node packs, and suggests a fix.

> /comfy:debug abc123-def456

Diagnose a specific execution by prompt ID.

Parameter sweep

> /comfy:batch a cat in a field, cfg:5-10:2, sampler:euler,dpmpp_2m

Generates a grid of images across all parameter combinations and presents a summary table with results.

Supported sweep parameters: cfg, steps, sampler, scheduler, seed, denoise, width, height.

Multi-step recipes

> /comfy:recipe hires-fix a dramatic fantasy landscape with castles

Runs two passes: txt2img at 512x768, then an img2img upscale to 1024x1536 that adds detail.

Available recipes:

Recipe

Description

portrait

Generate at 1024x1024, then 2x upscale to 2048x2048

hires-fix

Low-res generation → img2img upscale with denoise 0.4-0.5

style-transfer

Apply a style prompt to an existing image via img2img

product-shot

Product image with clean white background

Convert workflow format

> /comfy:convert ~/workflows/my-ui-workflow.json

Converts between ComfyUI's UI format (nodes + links arrays) and API format (node IDs → {class_type, inputs}).

Install a custom node pack

> /comfy:install comfyui-impact-pack

Searches the registry, shows details, clones the repo to custom_nodes/, installs dependencies, and offers to restart ComfyUI.

> /comfy:gallery last 5
> /comfy:gallery today

Lists recent outputs with their embedded metadata: checkpoint, prompt, seed, steps, CFG, and sampler for each image.

Compare workflows

> /comfy:compare workflow-a.json vs workflow-b.json

Shows added/removed nodes, changed parameters (old → new values), and optional Mermaid diagrams for visual comparison.

Validate before running

> Validate this workflow before I run it

Checks for missing node types, broken connections, invalid output indices, and missing model files without executing the workflow.

Manage models

> What checkpoints do I have installed?
> Search HuggingFace for SDXL turbo models
> Download this model to my checkpoints folder

Manage VRAM

> Free my VRAM
> What embeddings do I have?

Extract workflow from an image

> Extract the workflow from this image: ~/outputs/ComfyUI_00042_.png

Reads the PNG metadata chunks to recover the exact workflow and prompt used to generate the image.

Explore custom nodes

> /comfy:node-skill comfyui-impact-pack

Generates a skill file documenting every node, its inputs/outputs, and usage patterns.

Process control

> Restart ComfyUI
> Stop ComfyUI
> Start ComfyUI back up

Configuration

The server auto-detects your ComfyUI installation and port. Override with environment variables if needed.

Where to put keys and overrides:

  • Panel users. Use the API Keys card (▾ menu next to "connected"). Keys are stored in ~/.comfyui-mcp/panel-secrets.json and take effect without a restart.

  • MCP-only setups (Claude Desktop, Claude Code, etc.). Use the env block of your MCP client config, as shown in the setup examples above.

  • Real environment variables always take precedence over stored keys. For development, the server also loads ~/.comfyui-mcp/.env as an override file; regular installs shouldn't need it.

Deployment modes

comfyui-mcp operates in one of three modes, auto-selected from the environment:

Mode

Trigger

Local FS / process tools?

Local

default

yes

Remote

--comfyui-url / COMFYUI_URL points at a non-loopback host, or --force-remote is set

no — server skips COMFYUI_PATH auto-detection so stale local installs can't silently absorb uploads

Cloud

COMFYUI_API_KEY is set (targets Comfy Cloud)

no — HTTP primitives route via cloud.comfy.org over X-API-Key; WebSocket and local-only tools throw CLOUD_UNSUPPORTED

Some setups (e.g. dstack driving ComfyUI on RunPod) port-forward a remote ComfyUI back to localhost:8188, so the loopback check above reports a local install that isn't one. Pass --force-remote (or set COMFYUI_MCP_FORCE_REMOTE=1) alongside --comfyui-url/COMFYUI_URL to force remote mode regardless of hostname:

npx -y comfyui-mcp@latest --comfyui-url http://localhost:8188 --force-remote

Variable

Default

Description

COMFYUI_URL

Full ComfyUI URL, e.g. https://comfy.example.com:8443 — overrides COMFYUI_HOST/PORT/SSL and skips auto-detection. A path prefix is preserved (e.g. https://host/comfyapi) for reverse-proxied instances. Non-loopback hosts opt into remote mode.

COMFYUI_MCP_FORCE_REMOTE

Set to 1/true (or pass --force-remote) to force remote mode even when COMFYUI_URL/--comfyui-url resolves to a loopback host — for port-forwarded remote installs (e.g. dstack/RunPod) that are reachable at localhost. No effect without a COMFYUI_URL/--comfyui-url.

COMFYUI_HOST

127.0.0.1

ComfyUI server address

COMFYUI_PORT

(auto-detect)

ComfyUI server port (tries 8188, then 8000)

COMFYUI_PATH

(auto-detect)

Path to the ComfyUI data/base directory used for models, input/output and user state. In a conventional install this is also the checkout. Auto-detection suppressed in remote/cloud modes.

COMFYUI_CODE_PATH

COMFYUI_PATH

Optional path to the ComfyUI checkout (main.py, .venv, core git) when code and data live under different roots. Pip, venv, and core updates use this checkout (core updates prefer the checkout observed from the connected local server and use this as their fallback). Pack reads/writes — custom_nodes, comfy-cli --workspace, apply_manifest clone/checkout, workflow-lock pack commits — stay on the live --base-directory / COMFYUI_PATH data root (#1770).

COMFY_CLI_PATH

(auto-detect)

Path to the official comfy executable (comfy-cli >=1.11.1). Resolution also checks PATH and the selected workspace's .venv/venv.

COMFYUI_PYTHON

python

Python interpreter used by legacy git-clone dependency fallbacks. Point it at your ComfyUI venv's Python when needed.

COMFYUI_MCP_BRIDGE_HOST

127.0.0.1

Panel-bridge bind host. Set 0.0.0.0 (or a LAN IP) to run the orchestrator on a 24/7 server and connect panels from other machines — requires a token (below); the orchestrator prints a ready-to-paste ws://…/?token=… Bridge URL.

COMFYUI_MCP_BRIDGE_TOKEN

(generated when needed)

Shared secret gating every bridge connection (checked constant-time on the WS upgrade). Mandatory for a non-loopback COMFYUI_MCP_BRIDGE_HOST; pin it so the Bridge URL survives restarts. Never logged beyond the startup banner.

COMFYUI_MCP_DATA_DIR

~/.comfyui-mcp

Base dir for per-instance data (the generations.db behind get_history action: "suggest") when there's no local COMFYUI_PATH (remote/cloud/undetected). Scoped per target under instances/<host_port>/.

COMFYUI_API_KEY

Comfy Cloud API key. When set, cloud mode is active and the server talks to cloud.comfy.org. Never logged.

COMFYUI_CLOUD_URL

https://cloud.comfy.org

Override the Comfy Cloud endpoint (testing/staging).

COMFYUI_AUTH_TOKEN

Generic auth token for a self-hosted ComfyUI behind a reverse proxy / API gateway (distinct from Comfy Cloud). When set, attached to every ComfyUI request. Never logged.

COMFYUI_AUTH_HEADER

Authorization

Header name for COMFYUI_AUTH_TOKEN (e.g. X-API-Key).

COMFYUI_AUTH_SCHEME

Bearer for Authorization, else none

Scheme prefix on the token value (e.g. Bearer, Token).

CIVITAI_API_TOKEN

CivitAI API token for model downloads

HUGGINGFACE_TOKEN

HuggingFace token for higher API rate limits

COMFYUI_DOWNLOAD_PROXY

Optional HTTP/HTTPS proxy for model-download traffic only; standard proxy environment variables and static Windows WinINet settings are also honored

GITHUB_TOKEN

GitHub token for skill generation (avoids rate limits)

REGISTRY_ACCESS_TOKEN

Comfy Registry API key for node_pack (action: "publish") (env-only, never logged)

COMFYUI_DOWNLOAD_CACHE_DIR

~/.comfyui-mcp/cache

Content-addressed model-download cache (dedup + concurrent coalescing)

COMFYUI_LRU_CACHE_SIZE_GB

0

Cap the download cache in GB; 0 disables LRU eviction

COMFYUI_STARTUP_CHECK_INTERVAL_S / …_MAX_TRIES

1 / 60

Readiness-probe interval + max tries when starting a local ComfyUI

COMFYUI_ALWAYS_RESTART

false

Auto-restart a crashed local ComfyUI (bounded by COMFYUI_RESTART_MAX_ATTEMPTS / COMFYUI_RESTART_WINDOW_S)

COMFYUI_MCP_STALL_S

180

Render-wedge watchdog: seconds a sampler step can re-emit the same progress before a STALL/BACKLOG note is prepended to the agent's next turn (clamped 15–3600s; live-tunable from the panel)

COMFYUI_MCP_INTERRUPT_S

30

Seconds queue (action:"cancel") waits for an interrupt to actually stop a job before escalating to /free and reporting it wedged

LOG_LEVEL

info

Logging verbosity: debug, info, warn, error

Transports

The server speaks stdio by default, which is what Claude Code, Claude Desktop, and the MCP Inspector expect, so no flags are needed. For MCP gateways, remote/hosted setups, or fetch-based clients, opt into streamable-HTTP:

# stdio (default)
npx -y comfyui-mcp@latest

# streamable-HTTP on http://127.0.0.1:9100/mcp
npx -y comfyui-mcp@latest --http
npx -y comfyui-mcp@latest --http --host 0.0.0.0 --port 9100   # bind/port overrides

Flag

Env

Default

Description

--http / --transport http

MCP_TRANSPORT=http

stdio

Serve streamable-HTTP at /mcp instead of stdio

--host <h>

MCP_HOST

127.0.0.1

HTTP bind host (use 0.0.0.0 to expose)

--port <n>

MCP_PORT

9100

HTTP port

--comfyui-url <url>

COMFYUI_URL

(auto-detect)

Target a specific (incl. remote) ComfyUI

--force-remote

COMFYUI_MCP_FORCE_REMOTE

false

Force remote mode for a loopback --comfyui-url (e.g. dstack/RunPod port-forwards to localhost)

Other agents & local LLMs (Hermes, OpenClaw, Copilot CLI, Ollama)

comfyui-mcp supports non-Claude harnesses. One command writes the server entry into the harness's own config (it merges into an existing file rather than overwriting it):

npx -y comfyui-mcp setup hermes     # → ~/.hermes/config.yaml      (compact by default)
npx -y comfyui-mcp setup openclaw   # → ~/.openclaw/openclaw.json  (compact by default)
npx -y comfyui-mcp setup copilot    # → ~/.copilot/mcp-config.json (full by default)
# flags: --compact | --full, --comfyui-url <url>, --dry-run

Model requirements. Tool calling is a hard requirement; a model without tool calling doesn't work. Thinking and vision are recommended. Without thinking, multi-step tool chains degrade; without vision the agent can generate but can't see its own outputs.

Compact tool mode. --compact / COMFYUI_MCP_TOOL_MODE=compact registers 3 meta-tools (list_toolsdescribe_toolcall_tool) instead of the direct tool set, pulling schemas into context one tool at a time. That is the right trade for small local models. The direct tool set is the default and is what frontier-model harnesses want. Run it locally for free with our fine-tuned models. ollama pull artokun/gemma4-comfyui-mcp:e4b (also :e2b for ~2 GB VRAM, :12b for ~8 GB) is Gemma 4, QLoRA-trained on 1,055 server-verified trajectories over the full comfyui-mcp tool set, and is the panel's Ollama default. Stock gemma4:*/qwen3:4b are also validated end-to-end (npm run test:local-llm); gemma3 has no native tool calling and is unsupported. The full guide, covering hosted-model guidance (DeepSeek/MiMo/GLM class), per-harness setup, and troubleshooting, is Local LLMs & other agents.

Flag

Env

Default

Description

setup <agent>

Write the comfyui entry into hermes / openclaw / copilot config, then exit

--compact / --tool-mode compact

COMFYUI_MCP_TOOL_MODE=compact

full

Opt into the 3 meta-tools (list_tools / describe_tool / call_tool) instead of the direct tool set — recommended for small local models. --full is still accepted and is now a no-op

Remote ComfyUI

Point the server at a ComfyUI running anywhere; no local install is required:

npx -y comfyui-mcp@latest --comfyui-url http://192.168.1.50:8188
npx -y comfyui-mcp@latest --http --comfyui-url https://comfy.example.com:8443

Behind a reverse proxy / API gateway (path prefix + auth header). For a self-hosted ComfyUI exposed under a prefixed route with its own auth layer (this is not Comfy Cloud, which is COMFYUI_API_KEY):

COMFYUI_URL=https://gateway.example.com/comfyapi \
COMFYUI_AUTH_TOKEN=your-token \
  npx -y comfyui-mcp@latest --http        # → Authorization: Bearer your-token, requests under /comfyapi

# custom header / scheme:
COMFYUI_URL=https://gateway.example.com/comfyapi \
COMFYUI_AUTH_HEADER=X-API-Key COMFYUI_AUTH_TOKEN=your-token \
  npx -y comfyui-mcp@latest --http        # → X-API-Key: your-token

Auto-detection

Port: Probes 8188 (CLI default) then 8000 (Desktop app default) via /system_stats.

Path: Checks common locations in order:

  • ~/Documents/ComfyUI (macOS/Windows Desktop app data directory)

  • ~/Library/Application Support/ComfyUI (macOS)

  • ~/AppData/Local/Programs/ComfyUI/resources/ComfyUI (Windows Desktop app install)

  • ~/AppData/Local/ComfyUI (Windows)

  • ~/ComfyUI, ~/code/ComfyUI, ~/projects/ComfyUI, ~/src/ComfyUI

  • /opt/ComfyUI, ~/.local/share/ComfyUI (Linux)

  • Scans ~/Documents and ~/My Documents for any directory containing "ComfyUI"

Set COMFYUI_PATH to skip detection and use an explicit path.


How It Works

The server communicates with ComfyUI through its REST API and WebSocket interface:

  • WebSocket. Enqueue workflows, receive real-time progress updates (step by step via the background monitor script), get execution results

  • REST API. System stats, node definitions (/object_info), logs, history, queue management, workflow library, VRAM control (/free), embeddings

  • File system. Read/write the models directory, detect installation paths, upload images, extract PNG metadata, browse outputs

  • External APIs. HuggingFace (model search), ComfyUI Registry (custom node discovery), GitHub (skill generation), CivitAI (model downloads)

All communication with the MCP client (Claude Code) happens over stdio using the Model Context Protocol. Logs go to stderr so they never mix into the protocol stream.


Development

Prerequisites

Setup

git clone https://github.com/artokun/comfyui-mcp.git
cd comfyui-mcp
npm install

Scripts

Script

Description

npm run dev

Run from source with tsx (hot reload)

npm run build

Compile TypeScript to dist/

npm start

Run compiled output

npm test

Run unit tests (vitest)

npm run test:integration

Run integration tests (requires running ComfyUI)

npm run lint

Type-check without emitting

npm run generations:stats

Show local generation tracking statistics

npm run sync-agents

Sync Claude skills/commands/hooks to Google Antigravity, OpenCode, and other AI IDE formats that supports .agents files

Local testing with Claude Code

Point Claude Code at your local build instead of the npm package:

{
  "mcpServers": {
    "comfyui": {
      "command": "node",
      "args": ["/path/to/comfyui-mcp/dist/index.js"],
      "env": {}
    }
  }
}

Or test the plugin directly:

claude --plugin-dir ./plugin

Project structure

scripts/
  generation-stats.mjs         # CLI: npm run generations:stats
src/
  index.ts                 # MCP server entry point (stdio transport)
  config.ts                # Auto-detection & environment config
  comfyui/
    client.ts              # ComfyUI WebSocket/HTTP client wrapper
    types.ts               # TypeScript interfaces
  services/
    workflow-executor.ts   # Execute workflows, handle images & errors
    workflow-composer.ts   # Templates (txt2img, img2img, upscale, inpaint)
    workflow-validator.ts  # Dry-run validation (missing nodes, models, connections)
    image-management.ts    # Upload images, extract PNG metadata, list outputs
    mermaid-converter.ts   # Workflow → Mermaid diagram
    workflow-converter.ts  # UI → API: de-virtualize Get/Set buses + Reroutes, expand subgraphs, resolve bypass (powers get_workflow's strip action)
    workflow-slicer.ts     # sliceWorkflow() — rgthree Fast-Groups-Bypass pipeline un-chunker (shared by the CLI + get_workflow's slice action)
    mermaid-parser.ts      # Mermaid diagram → Workflow
    model-resolver.ts      # HuggingFace search, local models, downloads
    generation-tracker.ts  # SQLite generation log, settings dedup, stats
    file-hasher.ts         # SHA256 hashing of .safetensors with cache
    workflow-settings-extractor.ts  # Extract settings from workflow JSON
    process-control.ts     # Stop, start, restart ComfyUI process
    registry-client.ts     # ComfyUI Registry API
    skill-generator.ts     # Generate node pack skill docs
  tools/                   # MCP tool registration (one file per group)
    workflow-execute.ts    # enqueue_workflow, get_system_stats
    workflow-visualize.ts  # visualize_workflow (render/render_hierarchical/mermaid/to_dsl/from_dsl)
    workflow-compose.ts    # create_workflow (create/modify/validate/node_info)
    workflow-validate.ts   # the validate action's body
    workflow-library.ts    # get_workflow (8 read actions), save_workflow (save/lock/verify_lock)
    image-management.ts    # get_image (7 read actions), upload_image (5 write actions)
    model-management.ts    # download_model, list_local_models (the two consolidated model tools)
    memory-management.ts   # clear_vram
    registry-search.ts     # search_custom_nodes (search/details)
    node-management.ts     # install_custom_node (install/update/fix/uninstall/enable/disable/list/…)
    node-pack.ts           # node_pack (scaffold/verify/publish/read/write/patch/git/…)
    generation-tracker.ts  # the get_history suggest/stats jobs
    diagnostics.ts         # get_system_stats (action:"logs"), get_history
    process-control.ts     # restart_comfyui (restart/start/stop)
    index.ts               # Registers all tool groups
  utils/
    errors.ts              # Custom error hierarchy with MCP integration
    logger.ts              # stderr-only logging (safe for stdio transport)
    image.ts               # Base64 encoding utilities
plugin/
  .claude-plugin/          # Plugin manifest
  .mcp.json                # MCP server config for plugin
  commands/                # Slash commands
    gen.md                 # /comfy:gen — image generation
    viz.md                 # /comfy:viz — workflow visualization
    node-skill.md          # /comfy:node-skill — skill generation
    debug.md               # /comfy:debug — failure diagnosis
    batch.md               # /comfy:batch — parameter sweeps
    convert.md             # /comfy:convert — format conversion
    install.md             # /comfy:install — node pack installation
    gallery.md             # /comfy:gallery — output browser
    compare.md             # /comfy:compare — workflow diff
    recipe.md              # /comfy:recipe — multi-step pipelines
  skills/                  # Knowledge bases
    comfyui-core/          # Workflow format, node types, pipeline patterns
    prompt-engineering/    # CLIP syntax, model-specific prompting
    troubleshooting/       # Error catalog with patterns and fixes
    model-compatibility/   # Compatibility matrix per model family
  agents/                  # Autonomous agents
    explorer.md            # Research custom node packs, generate skills
    debugger.md            # Diagnose workflow failures
    optimizer.md           # Analyze and optimize workflows
  hooks/                   # Pre/post tool-use hooks
    hooks.json             # Hook configuration
    vram-check.mjs         # VRAM watchdog before execution
    save-warning.mjs       # Save prompt before stop/restart
    job-complete-notify.mjs # Job completion notification via temp files
  scripts/                 # Background scripts
    monitor-progress.mjs   # Real-time WebSocket progress monitor
    launch-server.mjs      # MCP server launcher — global install if present, else npx with a
                           #   cold-start handshake rescue so a first run cannot time out (#1447)

Troubleshooting

"ComfyUI not detected on ports 8188, 8000" Make sure ComfyUI is running. The Desktop app uses port 8000 by default; the CLI uses 8188. Set COMFYUI_PORT if you're using a custom port.

"COMFYUI_PATH is not configured" The auto-detection couldn't find your ComfyUI data directory. Set COMFYUI_PATH to the directory containing your models/ folder (e.g., ~/Documents/ComfyUI).

"Multiple ComfyUI installations detected" This is informational. The server uses the first one found. Set COMFYUI_PATH to pick a specific installation.

Model downloads fail For HuggingFace gated models, set HUGGINGFACE_TOKEN. For CivitAI, set CIVITAI_API_TOKEN.

Workflow execution errors Use /comfy:debug to diagnose failures. Or call get_history (action: "diagnose") / get_system_stats (action:"logs") directly to see the full error messages, including Python tracebacks from ComfyUI.

Out of memory (OOM) Use clear_vram to free GPU memory before running large workflows. The VRAM watchdog hook warns you when less than 1GB is free before a workflow runs. See the troubleshooting skill for model-specific VRAM estimates.

Missing custom nodes Use /comfy:install <pack> to install missing node packs from the registry. The debug command detects missing packs and suggests them.


Contributing

Contributions are welcome. See CONTRIBUTING.md for the dev setup, project conventions, how to add an MCP tool, and the release process.

Quick version: fork → branch (feat/my-feature) → make changes (make sure npm run build and npm test pass; run npm run docs:gen if you touched tools) → open a PR.


Maintainer

Built and maintained by @artokun, a regular contributor across the Comfy-Org ecosystem:

  • Comfy-Org/ComfyUI_frontend. 10 merged PRs, mostly on the v2 graph renderer: subgraph rendering, promoted-widget plumbing, viewport persistence, with backports across cloud/1.41, cloud/1.42, core/1.41, and core/1.42.

  • Comfy-Org/ComfyUI (core). Crash fixes in the Python backend's video/audio save path (#12683, #12550).

If you're at Comfy-Org (or hiring around the ComfyUI ecosystem), I'd love to chat. Email me at art.longbottom.jr@gmail.com.


License

MIT. See LICENSE for details.


Changelog

See CHANGELOG.md for the full, structured release history.

Available Tools

41 tools
apply_manifestA

Apply a ComfyUI setup manifest from an inline object or .json/.yaml/.yml file. Composes custom-node installs and model downloads, installs pip packages, and reports apt entries as skipped (system packages need manual/root installation). LOCAL ComfyUI: model downloads use the connected server's live/data model roots; pip uses the serving checkout (live main.py root, then COMFYUI_CODE_PATH, then COMFYUI_PATH); filesystem custom-node fallbacks use the live data/base root (live --base-directory, then COMFYUI_PATH). REMOTE ComfyUI: custom_nodes and models are routed through the ComfyUI-Manager HTTP API (handled on the host), while pip and apt entries are reported as skipped (no remote equivalent). Each item reports applied/skipped/failed/pending independently. success is true only when nothing failed AND nothing is still pending. A PARTIAL INSTALL (custom_nodes left unsubmitted when the time budget elapsed) is named in the partial field — a drained Manager queue / panel_node_queue_status does not include those entries; re-run apply_manifest to submit them. Do not restart ComfyUI until they report applied or skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
packNoA bundled installer pack by NAME, as reported by list_packs (action:"list"). PREFER THIS over `path` for a bundled pack: the name is resolved against the running build at apply time, while a manifest_path captured earlier points into an npx cache directory that a later respawn no longer has (#1568). Provide exactly one of `manifest`, `path`, or `pack`.
pathNoPath to a .json, .yaml, or .yml manifest file. Provide exactly one of `manifest`, `path`, or `pack`.
manifestNoInline manifest object. Provide exactly one of `manifest` or `path`.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility, and it delivers: it discloses success semantics ('success is true only when nothing failed AND nothing is still pending'), partial-install behavior in the partial field, the Manager-queue caveat, local path resolution order, and remote routing through ComfyUI-Manager. This is detailed, non-obvious behavior that an agent needs to know before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every clause earns its place: it covers input forms, item categories, local/remote path behavior, per-item statuses, success criteria, partial installs, and the restart warning. It is not a terse two-liner, but the complexity of the tool justifies the length and the information is grouped logically; only minor trimming of repeated 'LOCAL/REMOTE' details would improve it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex tool (nested manifest object, local vs remote modes, multiple item types, partial-failure states) with no output schema, yet the description covers what happens per item, how success is computed, what partial installs look like, and what follow-up action is needed. That makes the description sufficient for an agent to apply the tool correctly and interpret its result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; each parameter (pack, path, manifest) is already documented in the schema. The prose adds file-format context and environment-dependent resolution behavior, but it does not substantially enrich individual parameter semantics beyond what the schema and its param descriptions already provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Apply a ComfyUI setup manifest from an inline object or .json/.yaml/.yml file.' It then enumerates what the tool composes (custom-node installs, model downloads, pip packages, apt entries as skipped), making the tool's scope unambiguous and distinguishing it from single-purpose siblings like download_model or install_custom_node.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational guidance: local vs remote behavior, why some entries are skipped, and the warning not to restart ComfyUI until entries settle. It also indirectly signals when apply_manifest is appropriate (bulk manifest application) but does not explicitly name alternative tools or carve out when-list_packs/install_custom_node should be used instead, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

appsA

Micro-apps on this ComfyUI (panel Apps feature): named workflows packaged for one-click runs. Driven by the action parameter:

  • action:"list" — List every registered app. Each entry is the app's manifest: id, name, description, appMode {inputs, outputs}, deps, hideWorkflow, published. No other parameters. Read-only.

  • action:"get" — One app's manifest + bundle facts (has_workflow/has_prompt/has_thumbnail) by app_id. The manifest's appMode.inputs is the app's run form: each input has nodeId, widget, label, kind (text|number|combo|toggle|image|model), optional choices and default. Read-only.

  • action:"run" — Run one app: patches values (keys '.', e.g. {"6.text": "a cat"}) into the app's stored prompt snapshot and queues it on ComfyUI. Returns the prompt_id — poll action:"run_status". Only pass values for inputs listed in appMode.inputs; omitted inputs keep their conversion-time defaults.

  • action:"run_status" — Check one run by app_id + prompt_id: status (pending|running|done|unknown) plus the run's outputs (image/video file refs under each output node, text outputs). Read-only.

  • action:"import" — Install an app from the public registry: fetches the registry bundle (manifest + prompt snapshot [+ workflow unless hidden]) and creates it locally. The registry id becomes the local id, so re-importing reports an id conflict (already installed). Deps (models/custom nodes) are NOT installed — report the manifest's deps to the user so they can install them before running.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoaction:"import" — the app's registry slug (recorded in local metadata).
actionYesWhich apps operation to perform. "list" takes no other parameters; "get"/"run" require `app_id`; "run_status" requires `app_id` + `prompt_id`; "import" requires `registry_url` + `app_id`.
app_idNoThe app's uuid. REQUIRED for actions "get", "run", "run_status" (from action:"list") and "import" (the REGISTRY app's uuid, from the explore list).
valuesNoaction:"run" — input overrides keyed '<nodeId>.<widget>' (e.g. {"6.text": "a cat", "3.seed": 42}). Unknown keys fail loudly (the manifest drifted from the snapshot).
versionNoaction:"import" — the registry version (recorded in local metadata).
prompt_idNoaction:"run_status" — the prompt_id returned by action:"run". Required for that action.
registry_urlNoaction:"import" — registry worker base URL (required for that action). Must be the default public registry or an origin the operator allowlisted via COMFYUI_MCP_REGISTRY_URLS (the fetch is server-side — open URLs would be SSRF).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of disclosing behavioral traits. It does so extensively: read-only actions are marked, run returns prompt_id and patches values, unknown keys fail loudly, omitted inputs use defaults, import does not install deps and re-importing conflicts, and registry_url has SSRF concerns. This is model-level transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with a clear introduction and action-by-action bullets. Each sentence provides unique value: no redundancy, and every behavioral nuance (read-only flags, defaults, conflict warnings) earns its place. The format makes it easy for an agent to scan and extract needed information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's high complexity (5 actions, 7 params, nested objects) and the absence of an output schema, the description is remarkably complete. It specifies return values for each action (manifests, prompt_id, status/outputs), covers edge cases (deps not installed, SSRF, unknown keys), and leaves no major gaps. The agent has everything needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds substantial meaning beyond the schema. It explains that values are keyed by '<nodeId>.<widget>' with an example, that app_id has different requirements per action, and that registry_url must be allowlisted to avoid SSRF. This enriches the schema and provides operational context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific definition: 'Micro-apps on this ComfyUI (panel Apps feature): named workflows packaged for one-click runs.' This clearly distinguishes it from sibling workflow tools like enqueue_workflow or save_workflow. The five actions are each described with specific verbs and resources, fully specifying the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides detailed guidance for each action, including which parameters are required and the behaviors of list/get/run/run_status/import. It does not explicitly say 'when not to use' or compare to sibling tools, but the action-based structure gives clear context for when to invoke each operation. It also warns about import conflicts and missing deps, which informs user decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batchA

Run MANY ComfyUI workflows under one durable batch_id. Driven by the action parameter:

  • action:"submit" — Enqueue a batch. Provide EITHER workflows (array of API-format workflows) OR one workflow plus a sweep (array of flat input-override sets — each set produces one job, applied to every node that already has that input, like create_workflow (action:"modify")). Reuses the enqueue_workflow path (seeds re-randomized unless disable_random_seed). Returns { batch_id, count, prompt_ids }; the mapping is persisted to disk and stays valid across server restarts.

  • action:"status" — Per-job status for batch_id: each prompt_id's state (pending/running/done/error/unknown) plus rollup counts and all_terminal. Same status source as queue (action:"status").

  • action:"output" — Collected outputs for the batch's COMPLETED jobs: for each done prompt_id, the raw ComfyUI history outputs (node id → images/videos/audio filenames, same data get_history reports — feed filenames to get_image action:"get"). Jobs still pending/running are listed with their state; errored jobs carry the error message. Safe to call before the batch finishes.

  • action:"wait" — Block until every job is terminal (done or error) or timeout_s elapses, then return the same rollup as action:"status" plus timed_out/waited_s. Default timeout 300s, hard cap 600s — it can never hang; if timed_out is true, call it again or poll action:"status". Batch ids are durable — they survive server restarts.

ParametersJSON Schema
NameRequiredDescriptionDefault
sweepNoaction:"submit" — param sweep: one job per override set, e.g. [{"cfg":6},{"cfg":8,"steps":30}]. Each key is set on every node that already has that input.
actionYesWhich batch operation to perform. "submit" takes workflows | workflow+sweep; "status"/"output"/"wait" each require `batch_id` ("wait" also takes `timeout_s`).
batch_idNoThe batch_id returned by action:"submit". Required for actions "status", "output" and "wait".
workflowNoaction:"submit" — one base workflow in API format, used with `sweep`.
timeout_sNoaction:"wait" — max seconds to wait (default 300, hard cap 600).
workflowsNoaction:"submit" — array of ComfyUI workflows in API format (node ID -> {class_type, inputs}). Mutually exclusive with workflow+sweep.
disable_random_seedNoaction:"submit" — if true, do not randomize seed values (default randomizes per job).

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so exceptionally. It discloses seed randomization behavior, persistence of batch_ids across restarts, the hard cap on timeout_s (600s) ensuring wait can never hang, and that action:"output" is safe before batch completion — all beyond what the schema reveals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but efficiently structured with a lead sentence and action-by-action bullets. Every sentence earns its place; no filler or repetition. Front-loading with the core purpose makes it scannable despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This complex multi-action tool (7 params, no output schema) is fully explained. The description specifies return shapes for submit, status, output, and wait, including rollup counts, all_terminal, timed_out, and waited_s. It also covers edge cases like errored jobs and pending/polling behavior, making it self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds rich semantics the schema omits: sweep applies each override set to every node that already has that input, workflows and workflow+sweep are mutually exclusive, and each action's parameter requirements are spelled out (e.g., "wait also takes timeout_s"). This materially improves parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource: "Run MANY ComfyUI workflows under one durable batch_id." It then enumerates four specific actions (submit, status, output, wait) that distinguish it from sibling tools like enqueue_workflow and queue. The reference to reusing the enqueue_workflow path further clarifies its niche.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directly names when to use this tool and explicitly contrasts with alternatives: "Reuses the enqueue_workflow path", "like create_workflow (action:"modify")", and "Same status source as queue (action:"status")". It also tells users to feed output filenames to get_image, providing cross-tool guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bisectA

Binary-search (git-bisect style) over installed ComfyUI custom nodes to find which one causes a problem. A state machine driven by the action parameter:

  • action:"start" — Begin a session over all currently-enabled custom nodes. Enables half and disables the rest for the first test round, then guide the search with good/bad. Prefers the ComfyUI-Manager HTTP API; falls back to toggling .disabled directory suffixes for local installs. A ComfyUI restart may be needed for changes to take effect.

  • action:"good" — Mark the currently enabled set as GOOD (the problem is absent with this set). Narrows the search to the disabled candidates and enables the next subset. Resolves and reports the culprit when one node remains.

  • action:"bad" — Mark the currently enabled set as BAD (the problem is present with this set). Narrows the search to the enabled subset and enables the next subset. Resolves and reports the culprit when one node remains.

  • action:"reset" — Re-enable all custom nodes and clear the session. Use to abort a bisection or restore the installation after the search completes.

  • action:"status" — Report the current session state: status (idle/running/resolved), the remaining candidate node set, which nodes are enabled this round, and the identified culprit if resolved. All actions are argument-free; action is the only parameter. good/bad require a session already started with action:"start".

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich bisect operation to perform. "start" begins a session; "good"/"bad" narrow it (require a running session); "reset" clears it and re-enables everything; "status" reports state. No other arguments are needed for any action.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it explains the underlying mechanism (enables half, disables rest), mentions the preferred API and fallback to .disabled directory suffixes, warns that a restart may be needed, and details the state machine transitions. This goes well beyond a minimal description and gives the agent a clear model of side effects and prerequisites.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical but every sentence contributes essential information about the state machine, actions, and constraints. It is well-structured with a clear overview followed by per-action details, and the front-loaded purpose makes the tool's intent immediately clear. No redundant filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (state machine, side effects, fallback behavior), the description is remarkably complete. It covers all five actions, their prerequisites, the session lifecycle, the restart caveat, and the information returned by 'status'. Since there is no output schema, the explicit description of 'status' results is especially valuable. The description leaves no significant gaps for using the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant semantics beyond the schema by explaining each enum value's effect within the state machine (e.g., what 'good' does to candidate sets and when it reports the culprit). It also clarifies that all actions are argument-free and that 'good'/'bad' require an active session, which is not evident from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Binary-search (git-bisect style) over installed ComfyUI custom nodes to find which one causes a problem.' This clearly distinguishes it from sibling tools like search_custom_nodes or install_custom_node. The state machine explanation further clarifies its unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear when-to-use context for each action, such as 'Use to abort a bisection or restore the installation after the search completes' for reset, and notes that 'good'/'bad' require a prior 'start'. It does not explicitly name alternative tools, but the context strongly implies the appropriate scenario, so it lacks only the explicit exclusion guidance for a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

calculateA

Evaluate a batch of math expressions exactly — no ComfyUI connection needed, so it works even in cloud mode or when ComfyUI is down. A safe, zero-dependency expression evaluator (no eval): numbers only, no strings/arrays/property access. Handy for the arithmetic agents get wrong token-by-token.

Each line is one expression. name = expr assigns a variable that persists into later lines. Lines are separated by newlines or semicolons ONLY — commas are argument separators (e.g. min(a, b)), never expression separators.

Operators: + - * / // (floor div) % (modulo) ** (power, right-assoc), comparisons < <= > >= == != (return 1/0), unary minus. Constants: pi, e, tau. Functions: abs round min max pow sqrt floor ceil sin cos tan asin acos atan atan2 sinh cosh tanh exp log log10 log2 hypot radians degrees sign trunc clamp(x,lo,hi), plus seeded RNG rand() random() uniform(a,b) randint(a,b) (inclusive). Pass seed for reproducible RNG; it is echoed back when omitted.

Examples: • SDXL-legal resolution from an aspect ratio, snapped to /64: variables={ar: 1.5}; spec="w = floor(sqrt(10241024ar)/64)64\nh = floor(sqrt(10241024/ar)/64)64" • Reproducible seed batch (one 32-bit seed per line): spec="randint(0, 232-1)\nrandint(0, 232-1)\nrandint(0, 2**32-1)", seed=42 • CFG sweep: spec="3 + 00.5\n3 + 10.5\n3 + 20.5\n3 + 3*0.5"

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNoSeed for rand()/uniform(a,b)/randint(a,b). Same seed => identical sequence (mulberry32). Omit for a random seed (echoed in the result).
specYesExpressions to evaluate, separated by newlines/semicolons (string) or one per array item. `name = expr` assigns; assignments persist across subsequent lines. NOTE: comma is an argument separator (min(a,b)), NOT an expression separator.
variablesNoInitial variable environment, e.g. {"w": 1024, "ar": 1.5}.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: safe zero-dependency evaluator (no eval), numbers-only restriction, batch semantics, variable assignment persistence, separator rules (including the comma caveat), full operator/function list, and RNG seeding behavior (seed echoed back). This goes far beyond basic disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: purpose, safety, syntax, operators/functions, and three practical examples. It is front-loaded with the core purpose and uses clear formatting (paragraphs, ells, code blocks) to remain scannable despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description richly covers the input side—syntax, operators, functions, seeds, variables—and mentions seed echoing. However, it never explicitly states the output format/return shape (e.g., a list of results). For a calculator tool this is mostly inferable, but a one-sentence note on the return structure would fully close the gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a description, but the description adds significant semantic value: it explains the spec syntax (newline/semicolon separation, assignment, comma-as-argument-separator), provides examples, and details the RNG seed behavior and variable environment. This meaningfully exceeds what the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Evaluate a batch of math expressions exactly.' It clearly distinguishes the tool from all sibling tools (workflow/image/ComfyUI operations) and clarifies it works without ComfyUI. The scope is precisely defined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use it: 'works even in cloud mode or when ComfyUI is down' and notes it's 'handy for the arithmetic agents get wrong token-by-token.' It implies it is the go-to for safe arithmetic evaluation, though it does not explicitly name alternatives or say 'when not to use.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

call_toolA

Execute a tool from the catalog by name. Pass its parameters in args (object). The result is exactly what the underlying tool returns.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoThe tool's parameters as an object matching its describe_tool schema. A JSON-encoded string is also accepted. Omit for tools without parameters.
nameNoExact tool name from list_tools.
argumentsNoAlias for args.
tool_nameNoAlias for name.
parametersNoAlias for args.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It states that the result is exactly what the underlying tool returns, which is a useful behavioral note. However, it doesn't disclose potential side effects, errors, or the dynamic nature of execution. The description is adequate but lacks depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the main purpose, and includes essential operational detail about parameter passing and return behavior. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool's behavior is dynamic (executing arbitrary tools), the description covers the essential invocation details: name, args, aliases, and the fact that the result is passthrough. The schema also documents aliases fully. While it doesn't mention error handling or edge cases (e.g., unknown tool), for a wrapper tool this is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage across the parameters, including descriptions for name, args, and aliases. The description adds a bit by explaining the args object matches the describe_tool schema, and a JSON string is accepted. This supplements the schema, but the schema already covers the semantics well, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Execute a tool from the catalog by name' and how parameters are passed. It distinguishes itself from siblings like list_tools and describe_tool by focusing on execution, though it doesn't explicitly mention alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use: when you need to execute a tool from the catalog, providing the tool name and parameters. It doesn't explicitly contrast with alternatives like list_tools or describe_tool, but the purpose is clear enough to differentiate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_vramA

Free GPU VRAM by unloading cached models from ComfyUI. Use this between generation runs with different model families (e.g. switching from SDXL to Flux) or when running low on VRAM. Optionally unload only models or only memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
free_memoryNoFree cached memory/intermediates (default: true)
unload_modelsNoUnload all cached models (default: true)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the core behavior (freeing VRAM, unloading models) and optional toggles, but doesn't mention side effects like slower reload on next generation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no redundancy. The example clarifies usage without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple utility tool, the description provides enough context on when and how to use it. The lack of output schema is acceptable given the straightforward behavior, though a note about impact on subsequent runs would be beneficial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with clear descriptions. The description's mention of optional unloads directly mirrors the schema, adding minimal extra meaning beyond what's already present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Free GPU VRAM by unloading cached models from ComfyUI,' clearly identifying the verb and resource. It distinguishes from siblings like generate_image or get_system_stats by focusing specifically on VRAM management.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: 'between generation runs with different model families' and 'when running low on VRAM.' It also explains optional modes (only models or only memory), giving clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

comfy_cliB

Drive the official comfy-cli (envelope/1 JSON contract) for the selected ComfyUI environment. The MCP resolves comfy from COMFY_CLI_PATH, PATH, or the selected workspace's .venv/venv. Driven by the action parameter:

  • action:"status" — Inspect the comfy-cli integration and selected environment (comfy which / comfy env); detail selects version/which/env/discover (default env). Call this before local CLI operations when workspace or server routing is uncertain.

  • action:"server_start" / "server_stop" / "server_restart" — Manage a local ComfyUI through comfy-cli background process management. Restart performs comfy stop followed by comfy launch --background; extra launch arguments go in launchArgs.

  • action:"jobs_list" — List local or Comfy Cloud jobs (limit optional). Local jobs include CLI-tracked async submissions plus the ComfyUI queue/history.

  • action:"jobs_status" / "jobs_watch" / "jobs_cancel" — Inspect, watch, or cancel one job; promptId required.

  • action:"jobs_wait" — Wait for jobs: one of promptId, promptIds, or all=true is required; timeoutSeconds optional.

  • action:"search_nodes" — Fuzzy-search actual ComfyUI node classes by name, display name, or description using comfy nodes search; query required. Complements search_custom_nodes, which searches installable node packs. Works locally, in Comfy Cloud, or offline with objectInfoPath. When comfy-cli is not installed/on PATH and the target is the connected (local) server, falls back to fuzzy-searching that server's live /object_info — so installed-node discovery works without the CLI.

  • action:"workflow_validate" — Validate an API/UI workflow file (class types, inputs, enums, edge wiring) without submission; workflowPath required.

  • action:"workflow_run" — Submit an API/UI workflow file (workflowPath required). Asynchronous by default; set wait=true to await outputs (timeoutSeconds).

  • action:"transfer_upload" — Upload input files (files required) for local ComfyUI or Comfy Cloud; overwrite=false passes --no-overwrite.

  • action:"transfer_download" — Download completed outputs for promptId (required); outDir and urlOnly optional.

  • action:"models_list_folders" / "models_list_folder" / "models_search" / "models_show" — Discover model folders/files locally or in Comfy Cloud (folder required for list_folder, name for show). When comfy-cli is not installed/on PATH and the target is the connected (local) server, these read-only listings fall back to that server's own local models (via /models) — so model discovery works without the CLI.

  • action:"models_download" — Download a model url (required) into the workspace (relativePath, default models/checkpoints). A download can run for many minutes and is gated on an idle-liveness timeout, so a progressing download is never killed.

  • action:"models_remove" — Remove workspace model files (modelNames required; relativePath optional).

  • action:"skills_list" / "skills_show" / "skills_validate" / "skills_install" / "skills_status" / "skills_uninstall" — Manage the official comfy-cli bundled agent skills (comfy, fragments, debug, relay, director). validate requires path; install/uninstall default to dry-run unless apply=true; scope="project" requires projectDir.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoaction:"jobs_wait" — wait on every known job.
urlNoaction:"models_download" — model URL to download. REQUIRED.
nameNoactions "models_show"/"skills_show" — the model or skill name.
pathNoaction:"skills_validate" — path to the skill to validate. REQUIRED.
textNoaction:"models_search" — search text.
typeNoaction:"models_search" — model type filter (checkpoint, lora, vae, …).
waitNoaction:"workflow_run" — await outputs instead of returning after submission.
applyNoactions "skills_install"/"skills_uninstall" — actually mutate; default false = dry-run.
filesNoaction:"transfer_upload" — input files to upload. REQUIRED.
limitNoResult cap for "jobs_list", "search_nodes" and the "models_*" listing/search actions.
queryNoaction:"search_nodes" — fuzzy search text. REQUIRED.
scopeNoactions "skills_install"/"skills_uninstall"/"skills_status" — install scope.
whereNoTarget for the jobs/search_nodes/workflow/transfer/models actions: "local" (default) or "cloud" (Comfy Cloud).
actionYesWhich comfy-cli operation to perform. Families: status; server_* (lifecycle); jobs_* (list/status/wait/watch/cancel); search_nodes; workflow_* (validate/run); transfer_* (upload/download); models_* (list_folders/list_folder/search/show/download/remove); skills_* (list/show/validate/install/status/uninstall).
detailNoaction:"status" — which inspection to run.env
folderNoaction:"models_list_folder" — the model folder to list. REQUIRED.
outDirNoaction:"transfer_download" — output directory.
skillsNoactions "skills_install"/"skills_uninstall" — skill names.
targetsNoactions "skills_install"/"skills_uninstall" — agent targets.
urlOnlyNoaction:"transfer_download" — print URLs instead of downloading files.
promptIdNoSingle prompt id. Required for "jobs_status"/"jobs_watch"/"jobs_cancel" and "transfer_download"; accepted for "jobs_wait" (normalized into a one-element promptIds list).
overwriteNoaction:"transfer_upload" — set false to pass --no-overwrite.
promptIdsNoaction:"jobs_wait" — prompt ids to wait on. Use this or promptId or all=true.
workspaceNoOptional ComfyUI workspace override (the data/base root comfy-cli uses for custom_nodes/models). Otherwise the live --base-directory / COMFYUI_PATH is used; the CLI executable may still come from the COMFYUI_CODE_PATH checkout's .venv.
launchArgsNoactions "server_start"/"server_restart" — extra ComfyUI launch arguments, e.g. ['--listen','0.0.0.0','--port','8188'].
modelNamesNoaction:"models_remove" — model filenames to remove. REQUIRED.
projectDirNoWorking directory for project-scoped skill operations. Required when scope='project'.
relativePathNoactions "models_download"/"models_remove" — workspace-relative model directory (default models/checkpoints).
workflowPathNoactions "workflow_validate"/"workflow_run" — path to an API/UI workflow JSON file. REQUIRED.
objectInfoPathNoaction:"search_nodes" — offline object_info JSON file to search instead of a live target.
timeoutSecondsNoactions "jobs_wait"/"jobs_watch"/"workflow_run" — max seconds to wait.

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does well: it discloses that models_download runs for minutes and is gated on an idle-liveness timeout to avoid kills, that skills install/uninstall default to dry-run unless apply=true, that workflow_run is async unless wait=true, and that some actions fall back to server endpoints without the CLI. These are important behavioral traits beyond just the operation name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long with substantial repetition. For example, the action list in the description mirrors the enum values in the schema, and many actions are listed with similar phrasing like 'action:"..." — required for...' which duplicates schema properties. The structure is a flat job list without grouping headers or a summary, making it hard to scan quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high complexity (31 params, 26 actions), the description covers each action's purpose and required params, and it explains key behaviors like fallbacks, dry-runs, and timeouts, which is commendable. However, the lack of a user mapping for skills (despite mentioning the skill names), and no info on return values (output schema absent) leaves some gaps. It does not address relationships with sibling tools beyond two mentions, so completeness is average.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds some context by grouping actions on parameters (e.g., 'promptId required' for several actions) and clarifying defaults like 'relativePath' defaults to models/checkpoints. However, it does not systematically link each parameter to its action family; it often only repeats the required/optional flags already in the schema, and some parameters like 'where' have no additional explanation beyond the schema enum description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description lists many actions with specific verbs and resources (e.g., 'status — Inspect the comfy-cli integration', 'jobs_wait — Wait for jobs'), clearly specifying each operation. It differentiates from siblings by mentioning 'search_nodes' complements 'search_custom_nodes' and references other tools. However, it does not explicitly distinguish from all 38 sibling tools, and the purpose overall is a toolbox covering many functions, diluting a single clear purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: e.g., 'Call this before local CLI operations when workspace or server routing is uncertain' for status, and 'Complements search_custom_nodes' for search_nodes. It also clarifies when fallback occurs. However, it lacks explicit 'when not to use' statements for most actions, and alternative tools are mentioned only for search_nodes, not comprehensively.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_workflowA

Author and check ComfyUI workflow JSON. Driven by the action parameter:

  • action:"create" — Create a ready-to-run API-format workflow from a built-in template (txt2img, img2img, upscale, inpaint, controlnet, ip_adapter, ace_step_15, stable_audio_3, remove_background, ltx_video). Pure local generation — does not contact ComfyUI and has no side effects. Returns the complete workflow JSON; pass it to action:"validate" or enqueue_workflow. Unsupplied params fall back to template defaults, so the result may reference checkpoints/models that must exist on your ComfyUI server before it will execute.

  • action:"modify" — Apply modification operations to an existing workflow. Supports: set_input, add_node, remove_node, connect, insert_between. Returns the modified workflow JSON and IDs of any newly added nodes.

  • action:"validate" — Validate a workflow WITHOUT executing it. Checks for missing node types, broken connections, invalid output indices, missing models, and other issues. Returns a list of errors and warnings.

  • action:"node_info" — Query a running ComfyUI server's /object_info endpoint for installed node type definitions. Requires a reachable ComfyUI instance; results reflect that server's installed custom nodes. Use the node_type filter to inspect a specific node before composing or modifying a workflow. Default response is a STRUCTURAL summary: input/output names and type tags, with enum (dropdown) inputs collapsed to a value count — safe for context even on Loader nodes whose model dropdowns embed the entire local model list (hundreds of KB raw). Pass verbose=true (20 or fewer matches) for the complete raw definitions including every dropdown value. When more than 20 node types match, returns only a name/category list and asks you to narrow the filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich authoring operation to perform. "create" requires `template` (optional `params`); "modify" requires `workflow` + `operations`; "validate" requires `workflow` (optional `health`); "node_info" takes no required parameters (optional `node_type`, `verbose`, `refresh`).
healthNoaction:"validate" — Include graph-health heuristics (disconnected nodes, duplicate model loads, orphaned branches, muted/bypassed nodes) as info/warning issues plus a structured health section. Never affects `valid`.
paramsNoaction:"create" — Template parameters; recognized keys depend on the template. txt2img: checkpoint, positive_prompt, negative_prompt, width, height, steps, cfg, seed, sampler_name, scheduler. img2img/inpaint add image_path (and mask_path for inpaint) and denoise. upscale adds upscale_model. Unknown keys are ignored; omitted keys use template defaults.
refreshNoaction:"node_info" — If true, discard the memoized /object_info snapshot and refetch live from the connected server before answering. Use after the ComfyUI server was restarted EXTERNALLY (systemd/service manager) or new model files were added out-of-band — the cache is otherwise only invalidated by MCP-managed restarts, so loader dropdowns (model lists) would remain stale for the rest of the session (#499).
verboseNoaction:"node_info" — If true, return the full raw /object_info definitions including enum dropdown values (model lists etc.) — can be hundreds of KB per Loader node, so only use it when you need the actual enum values (e.g. exact model filenames) and the filter matches few nodes. Default false: structural summary with enum value counts.
templateNoaction:"create" (REQUIRED) — Template name, one of: txt2img, img2img, upscale, inpaint, controlnet, ip_adapter, ace_step_15, stable_audio_3, remove_background, ltx_video
workflowNoComfyUI workflow JSON (as a JSON string or object). REQUIRED for action:"modify" and action:"validate". action:"validate" accepts API format or a saved UI export (nodes[]/links[]).
node_typeNoaction:"node_info" — Filter by node class_type name (case-insensitive substring match). Omit to list all available nodes.
operationsNoaction:"modify" (REQUIRED) — Array of operations to apply in order. Each has an 'op' field: set_input, add_node, remove_node, connect, or insert_between

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it excels. It explicitly states side-effect-free behavior for `create` ('does not contact ComfyUI and has no side effects'), that `validate` does not execute, that `node_info` requires a reachable ComfyUI instance, and even discloses the staleness caveat with `refresh`. It also warns that `create` may reference models that must exist on the server. This is transparent and comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but highly structured and information-dense. It begins with a one-line purpose statement, then uses bullet points for each action, making it easy to scan. Every sentence adds value, such as listing template names, operation types, and clear return-value expectations. There is no redundancy or filler; it is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers all four actions, their parameters, and return values. It explains that `create` returns the complete workflow JSON, `modify` returns modified JSON plus new node IDs, `validate` returns errors/warnings, and `node_info` returns structural or verbose definitions. It also notes the acceptable input formats for `validate` (API or saved UI export). Given no output schema, this is complete guidance for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema covers 100% of parameters with detailed descriptions, the description adds meaningful behavioral context beyond the schema. For example, it explains that unsupplied `params` fall back to template defaults and that the result may reference models that must exist on the ComfyUI server. For `node_info` it describes the structural summary vs. verbose output and the 20-node threshold. These extras go beyond the schema's property descriptions, justifying a score above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Author and check ComfyUI workflow JSON.' It then breaks down each action (`create`, `modify`, `validate`, `node_info`) with specific verbs and resources, making it obvious what each operation does. It also distinguishes itself from siblings by noting that `create` is 'pure local generation' with no ComfyUI contact, which differentiates it from `enqueue_workflow`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit routing guidance: it tells the agent to pass the output of `create` to `validate` or `enqueue_workflow`, explaining that `validate` runs without executing, and `node_info` is for inspecting installed node types. It also clarifies when to use `refresh` and `verbose`, giving clear contextual triggers. This is strong usage guidance with direct references to alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_toolA

Get the full description and JSON Schema of one tool from the catalog. Always call this before the first call_tool of a tool you haven't used in this session.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoExact tool name from list_tools.
tool_nameNoAlias for name.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries a moderate burden. It describes what the tool returns ('full description and JSON Schema') and notes it comes 'from the catalog,' implying a read-only lookup. It does not explicitly state 'no side effects' or discuss error behavior, but for a trivial describe tool, this is acceptable and adds useful context about session-based best practice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The primary purpose is front-loaded in the first sentence, and the second sentence delivers a crucial usage directive. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (no output schema, no annotations, two self-explanatory parameters). The description fully covers its purpose, its role in the workflow, and hints at return content. Given the low complexity, this is complete and well-contextualized.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage: 'name' is described as 'Exact tool name from list_tools' and 'tool_name' as 'Alias for name.' The description adds no additional parameter semantics beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Get the full description and JSON Schema of one tool from the catalog.' This distinguishes it from siblings like list_tools (which lists all tools) and call_tool (which invokes a tool). The purpose is unambiguous and non-tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Always call this before the first call_tool of a tool you haven't used in this session.' This directly instructs the agent on the proper workflow and implies it should be used as a prerequisite for unfamiliar tools, making the usage context crystal clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_modelA
Destructive

Find model weights and get them onto the connected ComfyUI, and track the transfers. Driven by the action parameter:

  • action:"download" — Download a model file to the connected ComfyUI's models directory from a URL (HuggingFace, direct HTTP(S), s3://, or Azure Blob). Requires url + target_subfolder. PREFER this over a raw shell download (curl/wget) for model weights: it lands the file in the right models/ subfolder. LOCAL ComfyUI: streams to disk and surfaces live progress in the panel download tray. REMOTE ComfyUI: dispatches the fetch to the ComfyUI host via the ComfyUI-Manager install-model HTTP API (downloaded server-side; a per-request auth header can't be forwarded). This requires the host's Manager to run with network_mode=personal_cloud (or loopback) and a permissive security level — a stricter gate silently rejects the download, and Manager reports the queue task 'done' even on failure, so a remote dispatch does not guarantee the file landed. target_subfolder accepts any relative subfolder (incl. nested, e.g. 'loras/').

  • action:"status" — Check on downloads started by action:"download" / action:"download_civitai". Reports each download's state (downloading / done / error / cancelled), its destination path once it lands, and byte progress when the panel progress channel is enabled. Use this after a download reports it is still running — that means the transfer is in flight, NOT that it failed. Across an AGENT/sidebar session reconnect a download this MCP streams locally keeps running and is normally resolvable by id or by url. An ORCHESTRATOR RESTART is different: a record carried across one reports only that this MCP STOPPED WATCHING — not that the bytes stopped, which it does not check. READ THE NOTE ON THAT RECORD before acting: it distinguishes a local stream (nothing is writing it; re-issue) from a ComfyUI-Manager dispatch (the fetch runs on the ComfyUI host, which a restart here does not touch, so re-issuing writes a second copy to the same destination and CORRUPTS the model). And NOT FOUND NEVER MEANS STOPPED: both the cross-session record and the carry-over are written best-effort, so their absence is evidence of nothing. Omit id and url to list every tracked download. A previous session's download whose heartbeat has gone stale is reported with a stale-heartbeat NOTE: action:"cancel" can close it once the writer is proven gone. WHAT COMES AFTER THAT CANCEL DEPENDS ON THE ROUTE, and the note says which — for a local stream re-issuing resumes the .partial or restarts cleanly, but for a ComfyUI-Manager dispatch there is no local .partial and the host may still be fetching, so re-issuing is a duplicate dispatch that CORRUPTS the file. An older record that predates the route being stored says the route is UNKNOWN and tells you to verify the file before re-issuing, rather than guessing either way. Read-only.

  • action:"cancel" — Cancel ONE in-flight download by its id (from action:"status" or from the download that started it) — REQUIRED, and it must be the id of the download you mean, since a wrong id stops someone else's transfer. Aborts only that download's transfer; other downloads keep running. An id that names no tracked download is reported as such, not silently treated as success. The partially-downloaded bytes are left on disk as a resumable .partial and are NEVER reported as a completed file, so nothing corrupt lands in your models directory; re-issuing the same download later resumes where it left off. Idempotent: cancelling an already-finished, failed, or already-cancelled download just reports its current state. A download whose AbortController lives in ANOTHER live session cannot be aborted from here (stop it from the panel download tray) — but a download left 'downloading' by a session that is PROVEN gone (heartbeat stale AND its process no longer exists) CAN be cancelled from here: the stale record is closed as cancelled, after which re-issuing action:"download" resumes the leftover .partial or restarts cleanly. While the writer cannot be proven gone, the cancel refuses rather than risk two writers on one file. NOTE: for a download dispatched to a REMOTE ComfyUI via ComfyUI-Manager (server-side fetch), the local job is marked cancelled but the host may keep fetching — there is no Manager API to stop it.

  • action:"search" — Search HuggingFace Hub for models usable in ComfyUI (checkpoints, LoRAs, VAEs, ControlNets, etc.); query is required. Read-only and network-only: queries HuggingFace over HTTP, does NOT require a running ComfyUI or COMFYUI_PATH and does not download anything. Returns a ranked list with modelId, author, downloads, likes, and tags. Pick a result's download URL and pass it to action:"download". For CIVITAI searches ('find a Flux LoRA on Civitai') use action:"search_civitai" instead — it filters by type + base model and returns ids for action:"download_civitai". For packs of custom nodes (not models) use search_custom_nodes.

  • action:"search_civitai" — Search CivitAI by keyword for checkpoints, LoRAs, embeddings, VAEs, and ControlNets — THE action for 'find me a LoRA on Civitai'. Read-only and network-only (public CivitAI REST API; no token or running ComfyUI required; CIVITAI_API_TOKEN unlocks gated results). Filter by types (LORA, Checkpoint, TextualInversion, VAE, Controlnet, …) and base_models (CivitAI labels: 'Flux.1 D', 'SDXL 1.0', 'SD 1.5', 'Pony', 'Illustrious', 'Wan Video') — ALWAYS pass base_models when the user's checkpoint family is known, so results actually fit their setup. Each hit returns the model_id and version_id that action:"download_civitai" takes directly, plus trigger words to use in the prompt after installing. Flow: action:"search_civitai" → pick a hit → action:"download_civitai" {model_version_id, target_subfolder} → wire/prompt with the trained words. Pass creator (exact username, e.g. from action:"search_creators") to list ONE creator's models — with or without a query; at least one of the two is required. SFW-only by default. For HuggingFace search use action:"search".

  • action:"search_creators" — Find CivitAI CREATORS — THE action for 'who are the top creators on Civitai' and 'find creator '. Read-only and network-only (no token or running ComfyUI required). Two modes: with NO query it returns the site's creator LEADERBOARD (civitai.com/leaderboard — rank, score, downloads, likes; pick a board: 'overall' [default], 'overall_90' [last 90 days], 'overall_nsfw' [mature], 'new_creators' [first model <30 days ago]); with a query it searches usernames (public /api/v1/creators; partial match, returns model counts, NOT ranked). Each hit's username feeds action:"search_civitai" {creator: } directly. SCOPE CAVEAT: the /api/v1/creators index only lists creators who have published MODELS. A creator who posts only images/videos (no models) legitimately returns 0 hits here — that is a gap in this endpoint, NOT proof the creator doesn't exist. For a media-only creator, browse their images via the panel CivitAI browser (panel_open_civitai {creator}) or the logged-in browser session instead.

  • action:"download_civitai" — Download a model from CivitAI into the connected ComfyUI's models/ directory. Requires target_subfolder plus at least one of model_id / model_version_id. Resolves a CivitAI model id (latest version) or a model-version id to a download URL via the CivitAI REST API. LOCAL ComfyUI (COMFYUI_PATH set): streams the file to disk under /models// and returns the saved absolute path. REMOTE ComfyUI: dispatches the download to the ComfyUI host via the ComfyUI-Manager install-model HTTP API (fetched server-side). Gated/early-access models require CIVITAI_API_TOKEN locally (sent as a bearer header, never in the URL) — or pass a per-request auth, which overrides the configured token for that download; remote Manager-side fetches rely on tokens configured on the ComfyUI host. NOTE (remote): the server-side install requires the host's ComfyUI-Manager to run with network_mode=personal_cloud (or loopback) and a permissive security level; a stricter gate silently rejects the download, and Manager reports the queue task 'done' even on failure — so a remote dispatch does not guarantee the file landed.

  • action:"resolve_missing" — Find the model files a workflow needs but this ComfyUI does NOT have, and search CivitAI + HuggingFace for installable candidates. THE action for 'this Template says a model is missing — go get it'. Detects by comparing each model widget against the option list the server actually publishes, so it covers checkpoints, LoRAs, VAEs, ControlNets, UNets, CLIP and custom-pack model types without any per-node mapping. Each candidate reports size, source, precision/quantisation (fp16 / fp8 / GGUF Q4_K_M …) and whether it FITS this GPU's VRAM — so when the exact file is too big you can see the quantised variant that isn't. Read-only: it downloads nothing. Pass a chosen candidate to action:"download" (url) or action:"download_civitai" (id), using the reported directory as target_subfolder. For missing custom NODE PACKS (not models) use list_packs (action:"install_deps") instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe download id. REQUIRED for action:"cancel" — this is the handle that says WHICH transfer to stop, so take it from action:"status" (or from the reply that started the download) rather than guessing; an id that matches nothing is reported as not found. OPTIONAL for action:"status" — omit to list every tracked download (incl. in-flight ones from before a reconnect).
urlNoREQUIRED for action:"download" — the direct download URL for the model file. OPTIONAL for action:"status" — adopt an in-flight download by its source URL when you don't have the id (e.g. after a reconnect); reports the matching job without starting a duplicate.
authNoaction:"download" / action:"download_civitai" — optional per-request authentication for private/gated model URLs. When provided it overrides built-in HuggingFace/CivitAI token handling.
nsfwNoaction:"search_civitai" — include NSFW results (default false).
sortNoaction:"search_civitai" — ranking (default 'Highest Rated').
boardNoaction:"search_creators" — leaderboard to rank by when no query is given (default 'overall'). Ignored with a query.
limitNoMax results (default 10, or 8 candidates per missing model for action:"resolve_missing"). Per-action ceilings, unchanged from the tools this folds in: "search" 50, "search_civitai" 25, "search_creators" 50, "resolve_missing" 20.
queryNoREQUIRED for action:"search" — the HuggingFace search query (e.g. 'SDXL', 'flux', 'controlnet'). action:"search_civitai" — keyword search (e.g. 'detail enhancer', a character name); optional when `creator` is given (then it narrows that creator's models). action:"search_creators" — username search (partial match, e.g. 'alcait'); omit to get the top-creators leaderboard instead.
typesNoaction:"search_civitai" — only these model types (e.g. ['LORA']).
actionYesWhich model operation to perform. "download" requires `url` + `target_subfolder`; "status" takes an optional `id`/`tray_id`/`url` (omit all three to list everything); "cancel" requires `id` (optional `tray_id`); "search" requires `query`; "search_civitai" requires `query` and/or `creator`; "search_creators" takes an optional `query` (omit for the leaderboard `board`); "download_civitai" requires `target_subfolder` plus `model_id` and/or `model_version_id`; "resolve_missing" requires `workflow`.
filterNoaction:"search" — optional HuggingFace pipeline/library tag to narrow results, e.g. 'diffusers' or 'text-to-image'.
creatorNoaction:"search_civitai" — only models by this CivitAI creator (EXACT username — find it with action:"search_creators"). At least one of query/creator is required.
tray_idNoaction:"status" / action:"cancel" — use this when two rows come back with the SAME `id`, so the id alone cannot say which one you mean. That happens when two different source URLs are downloading to the same destination file. Every row prints its own tray id as `(tray <tray_id>)` — pass that here, together with `id`, to report on (or stop) exactly one of them.
filenameNoaction:"download" — override filename (auto-detected from the URL if omitted). action:"download_civitai" — override the saved filename (defaults to the CivitAI file name, or the URL basename).
model_idNoaction:"download_civitai" — CivitAI model id. The latest version is used unless model_version_id is also provided.
workflowNoREQUIRED for action:"resolve_missing" — the ComfyUI workflow in API format (JSON string or object).
base_modelsNoaction:"search_civitai" — only these base-model families, CivitAI labels: 'Flux.1 D', 'SDXL 1.0', 'SD 1.5', 'Pony', 'Illustrious', 'Wan Video', …
model_version_idNoaction:"download_civitai" — CivitAI model-version id (from the URL ?modelVersionId=...). If both model_id and model_version_id are given, this selects the specific version of that model.
target_subfolderNoREQUIRED for action:"download" and action:"download_civitai". Target subfolder under ComfyUI models/. Standard names: checkpoints, loras, vae, upscale_models, controlnet, embeddings, clip, diffusers, diffusion_models, gligen, hypernetworks, photomaker, style_models, text_encoders, unet. Any other relative subfolder (incl. nested like 'loras/<subdir>') is allowed; absolute paths and '..' escapes are rejected.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations (openWorldHint, destructiveHint, idempotentHint false) are enriched substantially: the description marks actions 'Read-only', explains the destructive cancel semantics, leftover .partial resumable bytes, remote-vs-local dispatch caveats, stale-heartbeat handling, and the 'silently rejects the download... does not guarantee the file landed' failure modes. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well organized by action with a clear required/optional breakdown, but notably verbose with substantial repetition — the remote ComfyUI caveat (network_mode=personal_cloud, 'does not guarantee the file landed') and the stale-heartbeat/duplicate-dispatch warning are restated nearly verbatim across multiple actions. Comprehensive, yet could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description thoroughly explains return values and side effects: status reports download state, destination path, byte progress; search returns ranked lists with modelId, author, downloads, likes; resolve_missing reports size, source, precision and VRAM fit. Error/edge cases (id matching nothing, unknown route, duplicate ids) are all covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Though schema coverage is 100%, the description adds significant meaning beyond the schema: it explains how params flow between actions (e.g., 'Each hit's username feeds action:"search_civitai" {creator:...}'), clarifies when tray_id is needed, interprets limit per action, and gives usage context for base_models, creator (EXACT username), and workflow (API format).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a very specific verb+resource (download models into ComfyUI) and enumerates 8 distinct actions with clear responsibilities. It also distinguishes itself from siblings, e.g. 'For packs of custom nodes (not models) use search_custom_nodes instead'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and exhaustive: it specifies when to use each action, which params are required per action, and explicitly points to alternatives ('For CIVITAI searches... use action:"search_civitai" instead'; 'For HuggingFace search use action:"search"'). Flow sequences are spelled out (search_civitai → download_civitai).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

enqueue_workflowA

Submit work to the ComfyUI execution queue — the primary way an agent starts a render. Driven by the action parameter:

  • action:"enqueue" — Submit an API-format workflow you are already holding (one you built with create_workflow, loaded with get_workflow, or edited with create_workflow action:"modify"). Returns immediately with the prompt_id and queue position; does NOT wait for completion. Seed values in the workflow are used EXACTLY as supplied — they are NOT re-randomized, so a run is reproducible by resubmitting the same workflow (for a fresh-seed re-run of a past job, use action:"rerun"). workflow is required. Use queue (action:"status") to check progress later, or get_history (action:"list") to retrieve results and images after completion.

  • action:"rerun" — Re-run the workflow behind a PREVIOUS generation. Retrieves the prompt graph from execution history (by prompt_id, or the most recent run when omitted — chosen by ComfyUI's queue number, same logic as get_history) and re-enqueues it, optionally applying inputs overrides. Seeds are re-randomized (within each node's declared range) unless disable_random_seed is set or the seed is pinned via inputs. Returns the new prompt_id and the source prompt_id it came from. Clear error if no matching history exists. To re-run from a registered ASSET instead of history, use generate_image (action:"regenerate").

  • action:"run_url" — Read (and optionally execute) a SHARED workflow from a URL. Fetches the workflow JSON, accepts API-format prompt graphs or UI-format exports (UI is auto-converted via the same converter as get_workflow), validates it, and summarizes it. Supports raw .json links and GitHub blob/raw URLs (blob is normalized to raw); other share hosts that need a site API return a clear 'paste the raw JSON URL' error. The fetch is bounded (http/https only, timeout + size cap, loopback/private/metadata IPs rejected to prevent SSRF). READ-ONLY unless run=true; when run=true it enqueues the workflow (applying optional inputs overrides) and returns the prompt_id. url is required.

  • action:"template_schema" — Get a template's OVERRIDABLE run-time parameters (its 'slots') BEFORE running it. Pass a bundled pack name (from list_packs action:"list") or a custom-node-contributed workflow template name (from list_packs action:"list_templates") as template. Returns slots — the meaningful knobs: positive/negative prompt, seed, steps, cfg, sampler/scheduler, width/height, checkpoint/LoRA/model files, denoise, batch_size, input image — plus other_slots (every remaining overridable widget), each with a stable key ".", semantic role, type, current value, and min/max/options where the node schema is known. Read-only. Feed the keys DIRECTLY into action:"run_template"'s overrides (same convention) for a schema→run round-trip.

  • action:"run_template" — ONE-SHOT: run a named workflow template (a bundled pack from list_packs) with optional overrides. Resolves the template's expert graph, applies overrides, and enqueues it — replacing the manual list_packs (action:"read_workflow") → create_workflow (action:"modify") → action:"enqueue" chain. Override keys are '.' (e.g. {'6.text': 'a cat', '3.seed': 42}) — the SAME keys action:"template_schema" reports (when available), so schema→run round-trips; only widget values can be overridden, never graph connections. By default returns {prompt_id} immediately; pass wait:true to block until the job completes and return its outputs (images etc.). Unresolvable template names return a clear error with near-matches. template is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNoaction:"run_url" — if true, enqueue the fetched workflow for execution and return the prompt_id. Default false: only fetch, validate, and summarize (read-only).
urlNoaction:"run_url" — URL of the workflow JSON. Raw .json links and GitHub blob/raw URLs work directly. REQUIRED for that action.
waitNoaction:"run_template" — block until the job completes and return its outputs. Default false: return {prompt_id} immediately.
actionYesWhich enqueue entry point to use. action:"enqueue" requires `workflow`; action:"rerun" takes an optional `prompt_id` (+ `inputs`); action:"run_url" requires `url` (+ `run`/`inputs`); action:"template_schema" and action:"run_template" require `template`; with action:"run_template" you may also pass `overrides`/`wait`/`timeout_s`.
inputsNoOverrides applied to every node with a matching input name (e.g. cfg, steps, sampler_name, seed, text). Used by action:"rerun", and by action:"run_url" only when run=true.
templateNoTemplate name/id: a bundled pack directory name (list_packs action:"list") or a custom-node-contributed workflow template name (list_packs action:"list_templates"). REQUIRED for action:"template_schema" and action:"run_template".
workflowNoaction:"enqueue" — ComfyUI workflow in API format (node ID -> {class_type, inputs}). REQUIRED for that action.
overridesNoaction:"run_template" — widget overrides keyed '<nodeId>.<widget_name>' (action:"template_schema"'s keys), e.g. {'6.text': 'a red fox', '3.steps': 20}.
prompt_idNoaction:"rerun" — prompt ID of the generation to re-run. If omitted, uses the most recent execution.
timeout_sNoaction:"run_template" — max seconds to wait when wait:true (default 300). On timeout the job keeps running; poll queue (action:"status").
disable_random_seedNoIf true, do not randomize seed values — applies to action:"rerun" and action:"run_template" (for action:"rerun", combine with inputs.seed to reproduce exactly). It is a NO-OP for action:"enqueue", whose seeds are always used exactly as supplied (issue #865).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully takes on the burden of behavioral disclosure. It covers async behavior ('Returns immediately... does NOT wait for completion'), seed handling ('used EXACTLY as supplied... NOT re-randomized'), SSRF protections ('loopback/private/metadata IPs rejected'), read-only vs. run modes, error responses, and timeout semantics. This is comprehensive transparency beyond what any annotation could succinctly convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though the description is long, it is tightly structured by action with clear headers and uses an introduction sentence that front-loads the primary use. Every sentence either specifies behavior, provides a cross-reference, or clarifies a schema nuance. Given the scale (5 actions, 11 parameters, several security and async details), the length is justified and the structure makes it easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description explicitly states return values for each action (e.g., 'prompt_id and queue position', 'new prompt_id and the source prompt_id', 'slots', '{prompt_id}'). It also covers error handling, timeouts, read-only vs. execution modes, and integration with sibling tools, making it highly complete for a complex multi-action tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all 11 parameters with 100% coverage, so the baseline is 3. However, the description adds substantial relationship context: it binds each parameter to specific actions, explains the 'same keys' convention between template_schema and run_template, and clarifies that `disable_random_seed` is a no-op for action:"enqueue" (issue #865). This goes well beyond a mere restatement of schema fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific verb+resource: 'Submit work to the ComfyUI execution queue — the primary way an agent starts a render.' It then enumerates five distinct actions, each with its own purpose, making it unambiguous what the tool does and how it contrasts with the broader toolset. This distinguishes it from sibling tools that handle workflow creation, retrieval, or inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use each action and provides direct alternatives: e.g., 'for a fresh-seed re-run of a past job, use action:"rerun"' and 'To re-run from a registered ASSET instead of history, use generate_image (action:"regenerate").' It also contrasts the full enqueue chain with the one-shot run_template action, offering clear decision guidance. This far exceeds the minimum 'clear context' threshold.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_imageA

Generate media from a prompt or an existing image — the high-level entry points that build the graph for you. Every action enqueues on the connected ComfyUI and returns the prompt_id immediately; the resulting asset_id arrives in the completion notification. Driven by the action parameter:

  • action:"image" — Text-to-image. Builds a txt2img workflow, filling any unspecified parameter from your configured defaults (get_defaults (action:"set") / COMFYUI_DEFAULT_* / config file), auto-selecting a local checkpoint when none is given — checkpoints known to lack a text encoder (e.g. video models) are skipped. prompt is required. For full control over the node graph, use create_workflow + enqueue_workflow instead.

  • action:"audio" — Text-to-audio, supporting the ACE Step 1.5 and Stable Audio 3 model families. Builds the appropriate workflow graph, filling unspecified parameters from your defaults and auto-selecting local models. model_family, prompt and duration are required. Requires a running ComfyUI with the corresponding model files installed.

  • action:"video" — Text-to-video, or image-to-video when image is given (animate a start frame). Composes an LTX-2.3 distilled workflow on your LOCAL GPU using the render-verified Comfy-Org node stack (gemma text encoder + abliterated/distilled LoRAs). Needs the LTX-2.3 models (~24-46GB): install with apply_manifest --path packs/ltx-2.3-txt2vid/manifest.yaml (or ltx-2.3-img2vid for i2v); returns an actionable error if the checkpoint is missing. seconds is converted to an 8n+1 frame count. For i2v, higher strength means MORE adherence to the start frame but LESS motion (1.0 can freeze the clip) — keep ~0.6. This minimal path omits the synchronized audio + stage-2 spatial upscale that the full ltx-2.3 packs ship. prompt is required. The video is written under output/video/ — find it with get_image (action:"list_outputs") (VHS/SaveVideo outputs may not appear in /history).

  • action:"3d" — Generate a 3D model (glb/obj/fbx) from a text prompt or an input image, using the connected ComfyUI's hosted partner 3D nodes (Tripo, Meshy, Rodin, Hunyuan3D — auto-detected from the server; these are paid API nodes needing a comfy.org API key/login on the server or COMFY_API_KEY here). mode is required ("text" needs prompt, "image" needs image). Poll queue (action:"status") / get_history (action:"list") for the resulting model file (saved to ComfyUI's output directory). If the server has no 3D-capable API nodes, returns an actionable error naming local-pack alternatives.

  • action:"controlnet" — Image conditioned by a ControlNet preprocessed image (pose skeleton, depth, canny, normal, etc.) plus a text prompt. Upload the control image first with upload_image (action:"image"), then pass its filename as control_image. prompt and control_image are required; checkpoint and controlnet_model auto-resolve from local models. control_image must ALREADY be a preprocessed map (this action does not run the preprocessor); requires a running ComfyUI with a matching controlnet model in models/controlnet/.

  • action:"ip_adapter" — Image guided by a reference image's style/subject via IP-Adapter, plus a text prompt. Requires the ComfyUI_IPAdapter_plus custom nodes. Upload the reference first with upload_image (action:"image"), then pass its filename as reference_image. prompt and reference_image are required; checkpoint auto-resolves. Requires a running ComfyUI with ComfyUI_IPAdapter_plus and a matching IP-Adapter model installed, or the workflow will fail at execution time.

  • action:"regenerate" — Re-enqueue the workflow that produced an EXISTING ASSET, optionally applying overrides. Overrides are applied to any node input matching the key name (e.g. cfg, steps, sampler_name, scheduler, seed, denoise, text). Seeds are re-randomized by default so each call yields a fresh image unless seed is explicitly passed in overrides. asset_id is required. To re-run from execution HISTORY rather than a registered asset, use enqueue_workflow (action:"rerun").

  • action:"upscale" — Upscale an image with an ESRGAN super-resolution model. Builds an UpscaleModelLoader → ImageUpscaleWithModel workflow (scale=2 supersamples the 4x result back down for sharper output) and enqueues it on your LOCAL GPU. Upload the source first with upload_image (action:"image") (or stage a prior output with upload_image (action:"stage")), then pass its filename as image. Needs an upscale model in models/upscale_models/ (e.g. 4x-ClearRealityV1 / 4x_foolhardy_Remacri, provided by the anima/ernie packs or download_model); returns an actionable error if none is found. image is required.

  • action:"remove_background" — Remove an image's background, returning a transparent (RGBA) cutout. Builds a LoadImage → BiRefNetRMBG → SaveImage workflow using the ComfyUI-RMBG (BiRefNet) matting node and enqueues it on your LOCAL GPU. Upload the source first with upload_image (action:"image") (or stage a prior output with upload_image (action:"stage")), then pass its filename as image. Requires the ComfyUI-RMBG custom node (pack: wan-transparent, or install_custom_node 'comfyui-rmbg'); the BiRefNet model auto-downloads on first run. If the node isn't installed, returns an actionable error telling you how to install it. image is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
bpmNoaction:"audio" — TextEncodeAceStepAudio1.5 tempo in beats per minute (ACE only, 10-300, default: 120).
cfgNoCFG scale. Actions "image", "audio", "video", "controlnet", "ip_adapter" (video defaults to 1.0 for the distilled model).
fpsNoaction:"video" — frames per second (default 25).
vaeNoaction:"audio" — ACE VAE model filename (in models/vae/); auto-selected if omitted.
clipNoaction:"audio" — Stable Audio CLIP encoder filename (in models/text_encoders/); auto-selected if omitted.
modeNoaction:"3d" — "text" = text-to-3D from `prompt`; "image" = image-to-3D from an uploaded input `image`. REQUIRED for that action.
nodeNoaction:"3d" — explicit 3D API node class_type to use (e.g. "MeshyTextToModelNode"); auto-selected if omitted. Use list_api_nodes with filter "3d" to see options.
seedNoSeed (omit to randomize). Actions "image", "audio", "video", "controlnet", "ip_adapter".
unetNoaction:"audio" — ACE UNet model filename (in models/diffusion_models/); auto-selected if omitted.
imageNoFilename of an image in ComfyUI's input dir (upload it first with upload_image (action:"image"), or stage a prior output with upload_image (action:"stage")). REQUIRED for action:"upscale" and action:"remove_background"; the start frame for action:"video" image-to-video; the input image for action:"3d" in mode "image".
min_pNoaction:"audio" — TextEncodeAceStepAudio1.5 LLM min-p sampling (ACE only, 0-1, default: 0).
modelNoModel file for the post-processing actions: action:"upscale" — an upscale model in models/upscale_models/ (auto-selected from local models if omitted); action:"remove_background" — the BiRefNet matting model (default 'BiRefNet_toonout'; auto-downloaded by ComfyUI-RMBG).
scaleNoaction:"upscale" — net upscale factor: 2 or 4 (default 4).
shiftNoaction:"audio" — ModelSamplingAuraFlow shift parameter (ACE only, default: 3).
stepsNoSampling steps. Actions "image", "audio", "video", "controlnet", "ip_adapter" (video defaults to 8 for the distilled model).
top_kNoaction:"audio" — TextEncodeAceStepAudio1.5 LLM top-k sampling (ACE only, 0-100, default: 0 = disabled).
top_pNoaction:"audio" — TextEncodeAceStepAudio1.5 LLM top-p nucleus sampling (ACE only, 0-2000, default: 0.9).
widthNoImage width in pixels. Actions "image", "controlnet", "ip_adapter".
actionYesWhat to generate. action:"image"/action:"video" require `prompt`; action:"audio" requires `model_family`+`prompt`+`duration`; action:"3d" requires `mode` (+ `prompt` or `image`); action:"controlnet" requires `prompt`+`control_image`; action:"ip_adapter" requires `prompt`+`reference_image`; action:"regenerate" requires `asset_id`; action:"upscale" and action:"remove_background" require `image`.
clip_aNoaction:"audio" — primary text encoder filename (in models/text_encoders/); auto-selected if omitted.
clip_bNoaction:"audio" — secondary text encoder filename (in models/text_encoders/); auto-selected if omitted.
heightNoImage height in pixels. Actions "image", "controlnet", "ip_adapter".
inputsNoaction:"3d" — provider-specific extra inputs passed through to the node (e.g. style, texture, quality). Use list_api_nodes (action:"schema") on the chosen node for valid keys.
lyricsNoaction:"audio" — lyrics or song structure description (ACE only — section-by-section breakdown).
presetNoaction:"ip_adapter" — IPAdapterUnifiedLoader preset (default 'PLUS (high strength)').
promptNoPositive text prompt. REQUIRED for actions "image", "audio", "video", "controlnet" and "ip_adapter"; for action:"3d" it is required in mode "text" and optional (passed through only if the chosen node accepts it) in mode "image". Unused by action:"regenerate", action:"upscale" and action:"remove_background".
weightNoaction:"ip_adapter" — IP-Adapter influence on the output, typically 0.0-1.0 (default 0.8); higher = closer to the reference.
samplerNoSampler name (e.g. euler, dpmpp_2m). Actions "image", "audio", "controlnet", "ip_adapter".
secondsNoaction:"video" — clip length in seconds (default 4; ~10s max).
asset_idNoaction:"regenerate" — asset id of the source generation. REQUIRED for that action.
durationNoaction:"audio" — audio duration in seconds. REQUIRED for that action.
languageNoaction:"audio" — language code for prompt (ACE only, default: 'en').
strengthNoTwo DIFFERENT knobs sharing one field, each with its own range, checked when the action runs: action:"video" (i2v only) — adherence to the start frame, 0-1 inclusive (default 0.6; higher = LESS motion); action:"controlnet" — conditioning strength, must be > 0, typically 0.0-2.0 (default 1.0; higher = stronger adherence to the control image).
overridesNoaction:"regenerate" — map of input-name → new value applied to every node that already has that input. Common keys: cfg, steps, sampler_name, scheduler, seed, denoise, text.
schedulerNoScheduler (e.g. normal, karras). Actions "image", "audio", "controlnet", "ip_adapter".
batch_sizeNoaction:"image" — number of images to generate.
checkpointNoCheckpoint filename; auto-selected from local models if omitted. The relevant checkpoint differs per action: a diffusion checkpoint for "image"/"controlnet"/"ip_adapter", the LTX checkpoint for "video", the Stable Audio 3 checkpoint for "audio".
resolutionNoaction:"video" — 'WIDTHxHEIGHT' e.g. '768x512' (rounded to multiples of 32; default 768x512).
musical_keyNoaction:"audio" — target musical key (ACE only, e.g. 'C major', 'E minor'; default: 'C major').
temperatureNoaction:"audio" — TextEncodeAceStepAudio1.5 LLM sampling temperature (ACE only, 0-2, default: 0.85).
weight_typeNoaction:"ip_adapter" — IPAdapter weight mode (default 'standard' — required by current IPAdapter_plus builds).
model_familyNoaction:"audio" — audio model family; determines which workflow template and model loaders to use. REQUIRED for that action.
audio_qualityNoaction:"audio" — SaveAudioMP3 bitrate/quality (ACE and stable_audio_3, one of 'V0'/'128k'/'320k', default: '320k').
control_imageNoaction:"controlnet" — filename of the (already-uploaded, already-preprocessed) control image in ComfyUI's input dir. REQUIRED for that action.
timesignatureNoaction:"audio" — TextEncodeAceStepAudio1.5 time signature (ACE only, one of '2'/'3'/'4'/'6', default: '4').
guidance_scaleNoaction:"audio" — TextEncodeAceStepAudio1.5 cfg_scale, the text encoder guidance scale (ACE only, default: 2).
filename_prefixNoOutput filename prefix. action:"audio" (default audio/ace_step or audio/stable_audio_3), action:"video" (default 'video/ltx-2.3') and action:"remove_background" (default 'ComfyUI_cutout').
negative_promptNoNegative prompt (default: empty / from defaults). Used by actions "image", "video", "controlnet", "ip_adapter" and — for the Stable Audio 3 family only — "audio".
reference_imageNoaction:"ip_adapter" — filename of the (already-uploaded) reference image in ComfyUI's input dir. REQUIRED for that action.
controlnet_modelNoaction:"controlnet" — ControlNet model file (in models/controlnet/); auto-selected if omitted.
disable_random_seedNoaction:"regenerate" and action:"3d" — if true, do not randomize seed fields. For action:"regenerate", combine with `overrides.seed` to reproduce the exact original image.
generate_audio_codesNoaction:"audio" — generate audio codes via the TextEncodeAceStepAudio1.5 LLM (ACE only, default: true).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It openly discloses asynchronous behavior ('Every action enqueues on the connected ComfyUI and returns the prompt_id immediately'), model auto-selection, default filling, error handling (e.g., 'returns an actionable error if the checkpoint is missing'), output locations, and limitations (e.g., 'This minimal path omits the synchronized audio + stage-2 spatial upscale'). It even explains nuanced behaviors like strength semantics ('higher strength means MORE adherence to the start frame but LESS motion (1.0 can freeze the clip)') and seed re-randomization. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but given the tool's complexity (9 actions, 52 parameters), every section earns its place. It front-loads the core behavior (enqueue, prompt_id) and then organizes each action into a clear block covering requirements, defaults, outputs, and limitations. It is dense but not bloated, though it could be slightly tightened by trimming redundant schema echoes. Well-structured with actionable separators.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is highly complex and has no output schema, so the description must explain what the tool returns and how to follow up. It states the immediate return (prompt_id) and the eventual asset_id via notification. For different actions, it explains where results land (e.g., 'The video is written under output/video/ — find it with get_image (action:"list_outputs")') and how to poll for 3D results ('Poll queue (action:"status") / get_history (action:"list")'). It also covers prerequisites, errors, and limitations for each action, making it a complete reference for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The schema already documents every parameter with action-specific descriptions, defaults, and requirements (e.g., strength descriptions for video and controlnet). The tool description adds some cross-action narrative (e.g., checkpoint differences per action) but largely restates what the schema already conveys. It does provide context like 'auto-selecting a local checkpoint when none is given' but that is also in the schema. No significant extra meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-resource statement: 'Generate media from a prompt or an existing image — the high-level entry points that build the graph for you.' It then enumerates nine distinct actions (image, audio, video, 3d, controlnet, ip_adapter, regenerate, upscale, remove_background), each with specific behavior. It also distinguishes itself from lower-level alternatives by noting 'For full control over the node graph, use create_workflow + enqueue_workflow instead.' This fully establishes what the tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-not-to-use guidance. It names alternatives for specific cases: 'For full control over the node graph, use create_workflow + enqueue_workflow instead' and 'To re-run from execution HISTORY rather than a registered asset, use enqueue_workflow (action:"rerun")'. It also states prerequisites for each action (e.g., 'Requires a running ComfyUI with the corresponding model files installed', 'Needs the LTX-2.3 models (~24-46GB): install with apply_manifest ...') and notes fallback behavior when prerequisites are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_defaultsA

Read and write settings — either OUR generation defaults or ComfyUI's own frontend UI settings. These are two SEPARATE stores and the action says which one you mean:

  • action:"get" — Return the merged view of OUR generation defaults with per-source attribution. Precedence (lowest → highest): config file → COMFYUI_DEFAULT_* env vars → runtime overrides via action:"set". Per-call MCP tool args always win over these defaults when consumed by a workflow-construction tool. Read-only, and works even with no ComfyUI running.

  • action:"set" — Update OUR generation defaults from values. By default updates the in-memory runtime layer (lost on restart); pass persist:true to also write the change into the config file (~/.config/comfyui-mcp/config.json by default). Use this to avoid repeating common values like width, height, steps, cfg, sampler, checkpoint.

  • action:"get_ui" — Read COMFYUI's OWN per-user frontend UI settings (the Comfy.* ids its Settings panel writes, served by the frontend user manager). This is a DIFFERENT store from action:"get" — nothing here feeds our generation defaults. Read-only. Provide id to read one setting's raw stored value; omit id to list all stored settings (optionally narrowed by filter). Known ids include Comfy.Validation.Workflows (boolean; its strictness rejects some custom-node workflows), Comfy.Execution.PreviewMethod (default|none|auto|latent2rgb|taesd), Comfy.LinkRenderMode (0 straight / 1 linear / 2 spline / 3 hidden), Comfy.UseNewMenu, and Comfy.Sidebar.Location. Ids are frontend-defined and stored verbatim; keys never written by the user are absent here and fall back to invisible frontend defaults. Values are surfaced with their raw stored type (no coercion). Requires a reachable local or remote ComfyUI; not available in Comfy Cloud mode.

  • action:"set_ui" — Modify one of COMFYUI's OWN persisted frontend UI settings by id. This writes ComfyUI's user settings store, NOT our generation defaults (that is action:"set"). The change is persisted immediately and takes effect on the next frontend load/refresh (an already-open UI tab keeps its old value until reloaded). The value is stored as-is: booleans/numbers are NOT coerced from strings, so pass true (not "true") and 2 (not "2"). Known ids: Comfy.Validation.Workflows (boolean; loosening it lets stricter custom-node workflows load), Comfy.Execution.PreviewMethod (default|none|auto|latent2rgb|taesd), Comfy.LinkRenderMode (0 straight / 1 linear / 2 spline / 3 hidden), Comfy.UseNewMenu, Comfy.Sidebar.Location. Ids are frontend-defined; an unknown id is stored verbatim and simply ignored by the UI. Returns { id, previous, value } — the prior value is read first so you can report and undo the change (previous is null when the key was unset).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoComfyUI UI setting id, e.g. 'Comfy.Validation.Workflows'. REQUIRED for action:"set_ui". OPTIONAL for action:"get_ui" — omit to list all stored settings.
valueNoaction:"set_ui" — REQUIRED. New value for the ComfyUI UI setting. Stored as-is; booleans/numbers are NOT coerced from strings (pass true, not "true").
actionYesWhich settings operation to perform, and on WHICH store. "get"/"set" are the MCP server's own generation defaults (width, steps, cfg, …); "get_ui"/"set_ui" are ComfyUI's separate frontend UI settings (the Comfy.* ids). "get" takes no other parameters; "set" requires `values` (optional `persist`); "get_ui" takes an optional `id` or `filter`; "set_ui" requires `id` + `value`.
filterNoaction:"get_ui" — case-insensitive substring filter on setting ids when listing (e.g. 'preview'). Ignored when `id` is given.
valuesNoaction:"set" — REQUIRED. Key/value map of GENERATION defaults to set. Keys are typically lowercase (e.g. width, steps). Not for Comfy.* UI ids — those go through action:"set_ui".
persistNoaction:"set" — if true, write to the config file in addition to runtime.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully covers behavioral aspects: read-only vs write operations, persistence semantics (runtime vs config/file), restart behavior, availability constraints (Comfy Cloud mode), type coercion absence, and return value details (e.g., for set_ui). It even explains the precedence of settings and how per-call MCP args override defaults.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (over 500 words) but structured per action with bullet points. Every sentence adds necessary detail given the complexity of four distinct actions. It is front-loaded with the core purpose and then elaborates systematically. While not minimal, the length is justified by the tool's multi-action nature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, 4 actions, two stores) and the absence of an output schema, the description covers most essential context: it explains precedence, persistence, availability, and known IDs. However, it omits the return structure for 'get' and 'get_ui' actions (it mentions a merged view but not its schema, and lists settings but not their format). Minor gap, but overall very complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds significant value beyond the schema: it ties each parameter to specific actions, explains required/optional contexts (e.g., 'REQUIRED for action:"set_ui"'), provides enumerations of known IDs, and clarifies type handling (booleans/numbers not coerced). This goes well beyond what the schema alone conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: reading and writing settings, with explicit differentiation between two separate stores (generation defaults vs ComfyUI UI settings). It uses specific verbs for each action and distinguishes the tool from siblings by covering unique functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use each action, including when not to (e.g., 'Not for Comfy.* UI ids — those go through action:"set_ui"'). It outlines prerequisites (e.g., 'Requires a reachable local or remote ComfyUI') and clarifies context for each of the four actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historyA

Read what has already been generated on this machine — execution history, why a run failed, and the settings your past renders actually used. Driven by the action parameter:

  • action:"list" — Execution history for a ComfyUI prompt: status, timing, cached nodes, and output details (media filenames for get_image action:"get"). Also carries the raw error/traceback. To diagnose WHY a run FAILED or what is missing, prefer action:"diagnose" — it returns the same failure info PLUS missing models (with the file + widget) and missing node types, which this action does not. Use action:"list" when you need the run's OUTPUTS or timing for a specific prompt_id.

  • action:"diagnose" — WHY DID MY RENDER FAIL / WHAT IS MISSING? Explains a failed run in ONE call, without needing a canvas — the headless counterpart to the panel's panel_get_errors ("why is this red?"), so mobile/remote sessions get the same answer. Returns: the failed node (id, type) with its exception_type + message and a trimmed traceback; missing_models (the exact model file that is not installed and the widget holding it — feed the filename to download_model action:'search_civitai', then action:'download_civitai' — or action:'search' then action:'download' — to fix it); missing_node_types (node classes this install lacks — feed to search_custom_nodes, then install_custom_node); and any other per-input validation errors. Call this whenever a run fails, an enqueue is rejected, or the user asks what is missing — instead of guessing from raw logs. With no prompt_id it diagnoses the most recent FAILED run (falling back to the most recent run). Read-only.

  • action:"stats" — Statistics from this MCP server's LOCAL generation-history database (populated as you run workflows; NOT from ComfyUI, and not the same source as action:"list"): total generations, count of unique sampler/scheduler/steps/CFG combos, a per-model-family breakdown, and the most-reused settings. Read-only; works without a running ComfyUI. Returns empty stats until you have generated images. For concrete recommended settings rather than aggregate counts, use action:"suggest".

  • action:"suggest" — Recommend concrete, proven sampler/scheduler/steps/CFG (and denoise/shift/LoRA) settings derived from that same LOCAL generation-history database. Read-only and works without a running ComfyUI. Narrow results by model_family, lora_hash, or a name search; with no filter it returns the top settings across all history. Returns a ranked list with each combo's reuse count, or a "no history" message until you have generated images. Use this for ready-to-apply values; use action:"stats" for aggregate counts and breakdowns rather than specific suggestions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoaction:"suggest" — max results (default 10).
actionYesWhich history view to return. "list" and "diagnose" read ComfyUI's execution history and take an optional `prompt_id`; "stats" and "suggest" read this server's own local generation-settings database and take `model_family` (plus `lora_hash`/`search`/`limit` for "suggest"). No action requires any other field.
searchNoaction:"suggest" — full-text search on model/LoRA filenames (e.g. 'copax', 'lightning').
lora_hashNoaction:"suggest" — AutoV2 hash (10 chars) of a specific LoRA to find settings for.
prompt_idNoActions "list" and "diagnose" — the prompt ID to look up (returned by enqueue_workflow). For action:"list", if omitted, returns the most recent COMMITTED execution (chosen by ComfyUI's queue number, not dict order); immediately after a run finishes it can briefly lag by one until ComfyUI commits the new entry, so pass the prompt_id from enqueue_workflow to get that exact run, and prefer the run-finished event for naming a just-produced output. For action:"diagnose", omit to diagnose the most recent FAILED run — preferred over a newer successful one — falling back to the most recent run if nothing failed.
model_familyNoActions "stats" and "suggest" — model-family key to scope to, e.g. 'sdxl', 'flux', 'qwen_image', 'illustrious'.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral disclosure burden. It does so admirably: repeatedly states read-only guarantees, clarifies that stats/suggest use a LOCAL database not ComfyUI, explains the fallback to most recent failed/successful run, warns about lag after a run finishes, and notes that stats return empty until generations exist. No contradictions with annotations since none exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but inherently complex with four actions and six parameters. It front-loads the core purpose in the first sentence, then uses clear bullets and action-specific subsections. Every sentence delivers distinct information: edge cases, fallbacks, data-source distinctions, and cross-tool links. No wasted words or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action tool with no output schema and no annotations, this description is exceptionally complete. It covers return values (status, timing, filenames, error tracebacks, missing models, node types, statistics), behavioral nuances (empty stats, lag, fallback logic), and prerequisites (works without ComfyUI for stats/suggest). It also provides actionable next steps for failure diagnosis, making it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already covers 100% of parameters, the description adds substantial semantic value: it maps each parameter to specific actions, explains defaults (limit default 10, prompt_id omission behavior), clarifies that prompt_id behaves differently for list vs diagnose, and gives example values (model_family: 'sdxl', 'flux'). It also explains which parameters interact with which actions, going far beyond the schema's short descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: "Read what has already been generated on this machine" and then enumerates four specific actions (list, diagnose, stats, suggest) each with a distinct purpose. It clearly differentiates from siblings like get_image and get_workflow by focusing on execution history, failures, and settings usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'To diagnose WHY a run FAILED or what is missing, prefer action:"diagnose"', 'Use action:"list" when you need the run's OUTPUTS or timing', and 'Call this whenever a run fails... instead of guessing from raw logs.' It also names alternative tools for follow-up actions (download_model, search_custom_nodes) and contrasts stats vs suggest. This is model-level guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_imageA

Fetch, browse and inspect ComfyUI images and registered assets. Driven by the action parameter:

  • action:"get" — Fetch a generated image from ComfyUI by FILENAME and return it as an inline image. Video/audio outputs (e.g. a VHS_VideoCombine .mp4) are saved to save_dir with their original extension instead of being rendered inline. Works with remote ComfyUI instances — does not require COMFYUI_PATH. Use get_history (action:"list") first to obtain the filename.

  • action:"view" — Fetch a registered asset's bytes by ASSET ID and return them as an inline image so the agent can see the result. Use this after a render completes (asset_id is included in the completion notification) to inspect, critique, or compare generated images. Only supports image mime types (PNG/JPEG/WebP); audio/video assets must be saved to disk via action:"get".

  • action:"list_outputs" — List recently generated image AND video files from ComfyUI's output/ directory, newest-first, with each file's kind ('image' | 'video'), subfolder, size, and modification time. Covers stills (.png/.jpg/.jpeg/.bmp) and video/animation outputs (.mp4/.webm/.mov/.mkv/.m4v/.avi/.gif/.webp). LOCAL ComfyUI (COMFYUI_PATH set): a RECURSIVE filesystem scan of output/ — includes subfolders like video/ that VHS/SaveVideo write to, and reports size + modification time. REMOTE ComfyUI: derives the list from /history over HTTP instead (size/modified are unavailable and omitted). It does NOT return the media bytes themselves — fetch those with action:"get". USE THIS TO CONFIRM A VIDEO RENDER (e.g. VHS_VideoCombine / LTX / WAN output) when get_history (action:"list") shows the prompt done but lists no output: VHS-style video nodes write the file but often do NOT register in ComfyUI's /history, so the local filesystem scan is the reliable way to verify the .mp4 exists — then chain it with upload_image (action:"stage"). THAT GUARANTEE IS LOCAL-ONLY AND INVERTS ON A REMOTE TARGET: with no disk to scan, this falls back to the very /history that omits those videos, so a REMOTE listing can neither confirm nor deny a VHS video render, and absence from it is NOT evidence the file is missing. Check a specific filename with action:"get" or upload_image (action:"stage") instead — both read /view, straight from the output directory. Every remote result says so in its own text. Read-only.

  • action:"convert" — Re-encode a generated image to PNG, JPEG, or WebP and return it inline as an image content block. Source can be a registered asset_id or a path under the local ComfyUI output directory. Optionally writes the converted image back under the output directory and reports source/output size plus bytes saved.

  • action:"analyze_color" — Measure the color of a rendered image (not by eye): returns black/white points, contrast (luma std), saturation, per-channel means + cast, and clipping — plus heuristic flags (washedOut, lowContrast, liftedBlacks, dimHighlights, lowSaturation, colorCast) and a one-line verdict. Source = asset_id, a ComfyUI output ref (filename/subfolder/type), or an image path. Pass reference_path to shot-match against a known-good frame (target−reference deltas). Set histogram:true to also get an overlaid R/G/B/luma histogram PNG. Use this to diagnose 'washed out' objectively and decide a color fix; for a video, extract a frame to PNG first.

  • action:"list_assets" — List recently generated assets, newest-first. Each call first reconciles ComfyUI's /history, so outputs are listed even when this session did not watch the render complete (e.g. queued via panel_run, by an earlier session, or before a server restart) — those are tagged source:'history-reconcile', versus source:'watched' for renders this server saw finish. Returns count + assets (asset_id, prompt_id, filename, url, source, created_at). The registry is ephemeral and clears on server restart; records expire after COMFYUI_ASSET_TTL_HOURS (default 24h), and only the most recent completed runs are reconciled — use get_history (action:"list") / action:"get" by filename for anything older.

  • action:"asset_metadata" — Get full provenance for a registered asset including the workflow snapshot that produced it. Use this to inspect the parameters that generated an image before calling generate_image (action:"regenerate") with overrides.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoA source image path. action:"convert" — a path under COMFYUI_PATH/output (provide exactly one of asset_id or path). action:"analyze_color" — an absolute image path, or a path under the ComfyUI output dir (videos: extract a frame to PNG first).
typeNoComfyUI directory the file lives in: output (default), input, or temp. Used by action:"get" and by action:"analyze_color" when the source is a `filename`.
limitNoaction:"list_outputs" — max media files to return, 1..100 (default 20). action:"list_assets" — max records to return (default: all, no upper bound).
sinceNoaction:"list_assets" — ISO timestamp; only return assets created at or after this time.
actionYesWhich image/asset operation to perform. "get" requires `filename`; "view" and "asset_metadata" require `asset_id`; "convert" requires `format` plus exactly one of `asset_id`/`path`; action:"analyze_color" takes one source (`asset_id`, `filename`, or `path`); "list_outputs" and action:"list_assets" take no required parameters.
effortNoaction:"convert" — WebP only: encoder effort, 0-6.
formatNoTwo unrelated meanings, one per action — the enum is the union of both and each action accepts only its own half. action:"list_outputs" — RESPONSE SHAPE: "markdown" (default, human/agent-readable) or "json" ({images:[{filename,subfolder,kind,size,modified}]} — for app clients building pick grids). action:"convert" — REQUIRED target encoded image format: "png", "jpeg" or "webp".
patternNoaction:"list_outputs" — filter by filename pattern (case-insensitive substring match).
qualityNoaction:"convert" — encoder quality, 1-100. Applies where supported by the selected format.
asset_idNoAsset id returned by action:"list_assets" or job completion. REQUIRED for actions "view" and "asset_metadata". OPTIONAL for "convert" (provide exactly one of asset_id or path) and action:"analyze_color" (one of asset_id, filename, or path).
filenameNoOutput image filename, e.g. PulID_Klein_00001_.png. REQUIRED for action:"get". OPTIONAL for action:"analyze_color", where it is one of the three ways to name a source (pair it with subfolder/type).
losslessNoaction:"convert" — WebP only: write lossless WebP.
out_pathNoaction:"convert" — optional output path under COMFYUI_PATH/output where the converted image should be written.
save_dirNoaction:"get" — absolute local directory to save the file in. Defaults to a 'comfyui-images' folder inside the platform temp directory (os.tmpdir()), which is created if missing. A RELATIVE value is resolved against this MCP process's working directory, which is the client's choice and may not be writable. On Windows a drive-less path like \out is resolved against this process's CURRENT DRIVE, not a drive you chose. Prefer a fully-qualified path (C:\... or \\server\share); the returned 'Saved to:' line always names the resolved absolute path.
histogramNoaction:"analyze_color" — also return an overlaid R/G/B/luma histogram PNG for visual confirmation (default false).
subfolderNoSubfolder within the directory, if any (default empty). Used by action:"get" and by action:"analyze_color" when the source is a `filename`.
progressiveNoaction:"convert" — JPEG only: write a progressive JPEG.
reference_pathNoaction:"analyze_color" — optional reference image to shot-match against; returns target−reference deltas for contrast, black/white points, saturation, and per-channel means.
max_preview_bytesNoaction:"get" — ceiling on the base64 payload returned INLINE (default ~16MB). The file saved to disk is never affected. Lower it when your client rejects or truncates large tool results; the reply says when it downscaled and by how much.
max_preview_dimensionNoaction:"get" — ceiling on the inline preview's longest side in pixels (default 4096). Applies even when the byte budget is satisfied, since some consumers reject by dimension — but only for an image this server can decode; an undecodable one under the byte budget is passed through as-is. Does not affect the saved file.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden and exceeds it. It discloses read-only status, local vs. remote behavioral inversions, registry expiry/TTL, that list_outputs does not return bytes, that video/audio are saved to disk rather than inline, save_dir path resolution pitfalls (Windows drive-less paths), and preview-size downscaling. These go far beyond what a schema or annotation would capture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the description is tightly structured with a leading summary, numbered action bullets, and paragraph breaks for exceptions. Every clause transfers new information; there is no filler, tautology, or repetition of schema mechanics. The length is proportionate to the tool's genuine complexity (seven actions, remote/local differences, multiple parameter combinations).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 20 parameters, 7 actions, no output schema, and no annotations, the description leaves little unanswered. It covers return behavior (inline image vs. saved file vs. JSON/markdown), side effects (write-back on convert), failure modes (remote listing can't confirm VHS videos), ordering semantics (newest-first), and integrations with sibling tools (chain with upload_image stage). It is self-sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a rich description, so the baseline is 3. The description adds extra value by organizing parameters per action, clarifying the dual meaning of the 'format' enum ('Two unrelated meanings... each action accepts only its own half'), and spelling out required versus optional combinations for each action (e.g., 'convert' requires format plus exactly one of asset_id/path). This is a meaningful layer beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Fetch, browse and inspect ComfyUI images and registered assets') and then enumerates seven distinct actions ('get', 'view', 'list_outputs', etc.), each with a clear verb and target. It explicitly differentiates from siblings by naming get_history and upload_image as alternatives. This is a model of purpose clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance for each action, including concrete exclusions: 'Use get_history (action:"list") first to obtain the filename', 'USE THIS TO CONFIRM A VIDEO RENDER... when get_history shows the prompt done but lists no output', and remote-vs-local caveats with alternative actions ('Check a specific filename with action:"get" or upload_image instead'). It states when list_outputs should not be used (remote) and how to choose between get and view.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_statsA

Inspect the connected ComfyUI server: what it is running on, what it has logged, and whether it is healthy enough to dispatch work to. All three actions are READ-ONLY — nothing here mutates anything. Driven by the action parameter:

  • action:"stats" — Get system information from the connected ComfyUI server: GPU device(s), total/free VRAM, ComfyUI/Python/PyTorch versions, and OS details. Requires a running ComfyUI server (works against local or remote targets); read-only, takes no parameters. Returns the raw /system_stats JSON. Use to confirm connectivity and check available VRAM before enqueuing large workflows. Errors if the server is unreachable.

  • action:"logs" — Get ComfyUI server runtime logs. Useful for debugging execution errors, model loading issues, missing nodes, and Python tracebacks. max_lines tails the end (default 100), keyword filters case-insensitively.

  • action:"health" — Pre-flight diagnostic for the connected ComfyUI: one call that aggregates the signals an agent should check before dispatching a batch. Reports ComfyUI version/Python/PyTorch, GPU name + VRAM free/total, system RAM free, queue depth (running + pending), per-category /models populations (catches empty dropdowns from a misconfigured extra_model_paths.yaml), and recent errors from /internal/logs. Read-only — no mutation. Use this when a job fails for an unexpected reason, before a long batch run, or to confirm a remote ComfyUI is healthy. Originally contributed by github.com/joaolvivas.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich read to perform. "stats" takes no other parameters; "logs" takes `max_lines`/`keyword`; "health" takes `model_categories`/`recent_errors`. None of them is required.
keywordNoaction:"logs" — filter log lines containing this keyword (case-insensitive). Examples: 'error', 'warning', 'VRAM', a node name.
max_linesNoaction:"logs" — maximum number of log lines to return from the end (default: 100).
recent_errorsNoaction:"health" — how many recent error/traceback lines to include from /internal/logs (default 20, max 200).
model_categoriesNoaction:"health" — override the model categories to poll (defaults to checkpoints, diffusion_models, loras, vae, text_encoders, controlnet).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavior: it repeatedly states all actions are READ-ONLY and 'nothing here mutates anything.' It also notes error conditions ('Errors if the server is unreachable') and describes what each action returns (e.g., raw /system_stats JSON, aggregated health signals). This is comprehensive for a diagnostic tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with a clear front-loaded purpose and bulleted action breakdowns. Every sentence serves a purpose: defining each action, its parameters, and its use case. The length is justified by the tool's multi-mode nature, and the structure aids scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complex three-action tool with no output schema, the description is remarkably complete. It specifies inputs, outputs, default values, error behavior, and use-case context for each action. It even covers edge cases like 'empty dropdowns from a misconfigured extra_model_paths.yaml.' No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not materially add to the parameter semantics already present in the schema; it repeats the action-scoped parameter explanations (e.g., 'max_lines tails the end (default 100)'). It does clarify that 'stats takes no other parameters,' but this is also in the action parameter description. No significant value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Inspect the connected ComfyUI server: what it is running on, what it has logged, and whether it is healthy enough to dispatch work to.' It then enumerates three distinct actions (stats, logs, health) with specific verbs and outcomes, effectively distinguishing this tool from siblings like get_history or get_image.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance for each action: stats for confirming connectivity and checking VRAM before enqueuing large workflows, logs for debugging execution errors, and health as a pre-flight diagnostic before batch runs or after unexpected failures. It also emphasizes the read-only nature, helping the agent choose this over mutating alternatives like restart_comfyui or clear_vram.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workflowA

Return, list, summarize or query a SAVED workflow FILE — files on disk, named from the library or given as a path/JSON — NOT the graph open on the user's canvas (that is panel_graph_outline). Every action here is READ-ONLY; saving and locking are save_workflow. Driven by the action parameter:

  • action:"get" — the full JSON of one saved workflow FILE named from the library. Defaults to converted API format; pass format:'ui' for the raw on-disk UI JSON. Use action:"analyze" instead if you just need to UNDERSTAND the workflow — it returns a structured summary without flooding context with JSON. Use action:"get" only when you need the actual JSON for enqueue_workflow, create_workflow (action:"modify"), or save_workflow.

  • action:"list" — the workflows saved in the connected ComfyUI server's user library (the same ones visible in the ComfyUI web UI), INCLUDING the ones filed in subfolders. Requires a running ComfyUI server. Takes no other parameters. Returns a numbered list of library names, each relative to the library root — a workflow in a folder appears as 'VIDEO/MiniMaxH3/clip.json', and that whole string is what filename takes. It never reports an absence it did not establish: a listing it could not read says so, and an EMPTY listing says the library could not be CONFIRMED empty (an answer with no names in it cannot show whether it covered subfolders) and tells you to check the ComfyUI sidebar rather than recreate anything.

  • action:"strip" — strip a workflow to a clean, flat API graph, resolving Get/Set buses, Reroutes, subgraph definitions, and bypassed/muted nodes into real connections (the 'de-getter-setter' pass). Unlike action:"get" this reads from ANY server-side file path on disk (not just the workflow library), so it loads ad-hoc / expert workflow files that action:"list" and panel_open_workflow can't resolve. Provide exactly one of: path, filename, or graph. Returns conversion warnings, a node-type summary, and the stripped graph (much smaller than the raw UI JSON).

  • action:"slice" — slice ONE pipeline out of a toggle-template workflow, the kind built with rgthree 'Fast Groups Bypasser/Muter' where one graph holds many pipelines and only one is active at a time. Seeds from the output/SaveImage nodes in the named groups, takes their backward dependency closure (through real links AND virtual Set/Get buses), un-bypasses the kept nodes (and the internals of any subgraph defs they use), and returns a STANDALONE, activated UI graph carrying only the subgraph defs it uses. Pair with action:"strip" afterward to flatten the Set/Get buses into real connections.

  • action:"from_image" — extract embedded ComfyUI workflow metadata from a PNG file. ComfyUI stores the full workflow (API format) and prompt data in PNG tEXt chunks. Use this to reverse-engineer how any ComfyUI image was generated.

  • action:"analyze" — SUMMARIZE a saved workflow file named from the library: sections, node settings, connections, and data flow. Returns a concise text summary (not raw JSON) optimized for AI reasoning. Prefer this over action:"get" unless you need the raw JSON for enqueue_workflow or create_workflow (action:"modify").

  • action:"query" — filter, traverse, project, and aggregate over a saved workflow's nodes WITHOUT dumping the whole JSON (the missing middle between action:"analyze"'s fixed summary and action:"get"'s full dump; on 100+-node graphs this is the ONLY context-safe way to answer questions like 'which KSamplers run cfg>7', 'what feeds node 42', 'count nodes by type'). Provide exactly one of path/filename/graph, then combine: types, title, where widget predicates ANDed ('cfg>7', 'steps<=20', 'sampler_name=euler', 'text~sunset' — ops = != >= <= > < ~contains), ids, upstream_of/downstream_of + depth, fields, group_by, limit, max_chars. Output is TOKEN-BOUNDED and, when it truncates, the tail names WHICH of the two caps fired and the exact parameter to raise — read it and retry rather than concluding the graph can't be read. For the LIVE canvas this is panel_query_graph instead.

  • action:"prompt_director" — read Prompt Director's latest sanitized RUNTIME state after its nodes execute: each node id, node kind, resolved Model Explorer model/LoRA context, structured edit plan, source analysis, exact final prompt, warnings, or Result Critic verdict. Secrets and image tensors are redacted. Pair it with a live panel graph audit: graph inspection explains wiring and widget state, while this explains what the nodes actually resolved and compiled. Pass node_id to inspect one executed Prompt Director node.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoaction:"query" — Keep exactly these node ids.
pathNoaction:"strip" / "slice" / "query" — Absolute server-side path to a workflow .json on disk (e.g. C:\\Users\\you\\ComfyUI\\user\\default\\workflows\\pusa_extend.json). Read directly from disk — no library lookup.
viewNoaction:"analyze" — summary (default): structured text with sections, node IDs, key settings, virtual wires, and full connection graph — best for AI understanding. overview: mermaid diagram showing sections as summary nodes with cross-section data flow. detail: mermaid diagram for one section (requires section parameter). list: text listing of all sections with data flow summary. flat: single mermaid flowchart of the entire workflow (best for small workflows). health: graph-health heuristics (disconnected nodes, duplicate model loads, orphaned branches, muted/bypassed).summary
depthNoaction:"query" — Max hops from the traversal seed (seed=0). Absent = full closure.
graphNoaction:"strip" / "slice" / "query" — Inline workflow JSON (UI format for "strip"/"slice"; UI or API for "query"), as an alternative to path/filename.
limitNoaction:"query" — Max nodes listed (default 40, max 200).
titleNoaction:"query" — Keep nodes whose title contains this.
typesNoaction:"query" — Keep nodes whose class_type contains ANY of these (case-insensitive).
whereNoaction:"query" — Widget predicates, ANDed: 'cfg>7', 'sampler_name=euler', 'text~sunset'.
actionYesWhich read to perform. "list" and "prompt_director" take no required parameters; "get" and "analyze" require `filename`; "strip", "slice" and "query" require exactly one of `path`/`filename`/`graph` (and "slice" also requires `groups`); "from_image" requires `image_path`.
fieldsNoaction:"query" — Projection: compact one-liners (default), bare ids, or detail JSON rows.
formatNoaction:"get" — 'api' (default, recommended) converts to compact API format with named inputs, connection references, and _meta.mode flags for muted/bypassed nodes; 'ui' returns the raw UI format with layout positions and links arrays. action:"strip" — 'api' (default) strips to the flat resolved graph; 'raw' returns the file/graph unchanged. Each action accepts only its own two values (this field is the union of what the two tools it replaces accepted) and refuses the third rather than guessing at an alias.api
groupsNoaction:"slice" (REQUIRED) — Group-title substrings (case-insensitive) whose output nodes seed the slice — CSV string or array, e.g. 'TEXT TO IMAGE,TXT' or ['extend','sampler']. Shared post-proc is pulled in via the closure.
node_idNoaction:"prompt_director" — Optional ComfyUI node id; omit to list all recent Prompt Director runtime states.
sectionNoaction:"analyze" — Section name for detail view. Use view='list' first to see available section names.
filenameNoWorkflow library name, exactly as action:"list" reports it. A workflow filed in a folder keeps its folder in the name ('VIDEO/MiniMaxH3/clip.json') and that whole string goes here. REQUIRED for action:"get" and action:"analyze"; one of the three sources for "strip", "slice" and "query".
group_byNoaction:"query" — Aggregate: counts per class_type instead of listing.
max_charsNoaction:"query" — Output character bound (default 12000, max 60000). Raise this — not `limit` — when the truncation tail says the char budget cut the result.
image_pathNoaction:"from_image" (REQUIRED) — Absolute path to a ComfyUI-generated PNG file
upstream_ofNoaction:"query" — Scope to the dependency closure FEEDING this node id.
downstream_ofNoaction:"query" — Scope to the nodes CONSUMING this node id's outputs.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full transparency burden and exceeds it: it declares 'Every action here is READ-ONLY', discloses the list action's careful absence semantics ('It never reports an absence it did not establish... an EMPTY listing says the library could not be CONFIRMED empty'), and explains query's token-bounded output with a tail that names which cap fired. It also reveals redaction behavior ('Secrets and image tensors are redacted') and format defaults, going far beyond what schema fields could convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (~700 words) but well-structured with bolded action headers, consistent bullet formatting, and an excellent front-loaded first sentence that establishes scope and sibling differentiation. Some redundancy exists — for example, the analyze-versus-get preference is stated in both the 'get' and 'analyze' bullets, and 'exactly one of path/filename/graph' appears both in the prose and the action parameter description. For an 8-action, 21-parameter tool, the length is largely warranted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must cover return behavior — and it does for every action: list returns a numbered library list, strip returns conversion warnings plus a node-type summary plus the stripped graph, query output is token-bounded with identifiable caps and retry advice, and prompt_director returns sanitized runtime state with redactions. Prerequisites ('Requires a running ComfyUI server'), edge cases (empty listing ambiguity), and cross-tool integration guidance are all addressed. This is complete for the tool's considerable complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds substantial operational meaning: it documents the where-predicate operator syntax ('ops = != >= <= > < ~contains'), explains the two-cap truncation system so agents know to raise max_chars rather than limit, and specifies per-action parameter requirements (slice requires groups; strip/slice/query require exactly one of path/filename/graph). It also clarifies the format union's refusal behavior ('refuses the third rather than guessing at an alias'), which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence nails the purpose: 'Return, list, summarize or query a SAVED workflow FILE — files on disk, named from the library or given as a path/JSON — NOT the graph open on the user's canvas (that is panel_graph_outline).' It uses specific verbs, names the resource exactly, and explicitly excludes the live canvas while naming the sibling that handles it. Each of the eight action values is further defined with its own precise behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is saturated with explicit when/when-not guidance and named alternatives: 'saving and locking are save_workflow', 'Use action:"analyze" instead if you just need to UNDERSTAND the workflow... Use action:"get" only when you need the actual JSON for enqueue_workflow, create_workflow (action:"modify"), or save_workflow', and 'For the LIVE canvas this is panel_query_graph instead.' It also gives pairing advice, such as using slice then strip, and explains why strip can load files that list and panel_open_workflow cannot resolve.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

install_comfyuiA
Destructive

Install, update and configure the local ComfyUI installation, its sidebar panel, and this MCP server itself. Driven by the action parameter:

  • action:"install" — Install ComfyUI locally: git-clone it into target_path, create a dedicated workspace virtualenv (/.venv), and install Python requirements INTO that venv (never the Python running this MCP server) via pip or uv. ComfyUI-Manager is installed from manager_requirements.txt when present, else git-cloned as a fallback. Mirrors comfy-cli install. LOCAL, subprocess-only and independent of any remote --comfyui-url target; the target dir must be empty or non-existent (an existing install is never overwritten). Runs SYNCHRONOUSLY and can take several minutes (large git clone + full torch/dependency install); the call blocks until done. On success returns a JSON report { installed, targetPath, venvPath, comfyuiUrl, managerInstalled, managerVia, version, pythonInstaller, steps[] }. Does NOT start ComfyUI. target_path is REQUIRED.

  • action:"update" — Update the ComfyUI CORE install: runs git pull in the connected local server's observed checkout (falling back to COMFYUI_CODE_PATH, then COMFYUI_PATH) and reinstalls its Python requirements (auto-detecting uv vs pip). Returns a clear error when targeting a remote instance via --comfyui-url. The requirements install targets the running server's own interpreter (recorded when this server launched ComfyUI, or an explicit COMFYUI_PYTHON); when that interpreter cannot be verified the update refuses rather than install into a guessed environment — start ComfyUI or connect first. Does NOT touch custom nodes.

  • action:"update_all" — Update ALL installed CUSTOM NODES via the ComfyUI-Manager HTTP API. Mirrors comfy-cli update all. This does NOT update ComfyUI core — use action:"update" for that. Works against the connected instance (local or remote); updates run asynchronously and a ComfyUI restart may be required afterward. REFUSED while the comfyui-mcp sidebar panel is version-pinned, because 'all' would move the pinned panel too and ComfyUI-Manager cannot update everything-except-one-pack — clear the pin with action:"panel" + panel_action:"unpin", or update the other packs individually by id.

  • action:"panel" — Install, update, reinstall, sync, pin, unpin, unlock, or report status of the ComfyUI sidebar panel ('comfyui-agent-panel' on the Comfy Registry; repo comfyui-mcp-panel) in the LOCAL ComfyUI's custom_nodes, selected by panel_action (default "status"). Uses the same ComfyUI-Manager path as install_custom_node and always targets the 'nightly' (git-HEAD) channel. Local-only (no-op/refuses in remote/cloud mode) and NEVER modifies a dev install (a symlinked panel dir). After install/update/reinstall/sync, ComfyUI must be RESTARTED to load the new/updated node — this tool does not auto-restart. The panel is also auto-installed-if-missing when the MCP server loads. A version PIN (panel_action:"pin") holds the panel where it is: while a pin is set, install/update/reinstall/sync and the auto-install all refuse, and 'sync' only warns that a newer panel exists. Panel operations are serialized across orchestrator processes by a lock file that is never auto-reclaimed — if a crashed orchestrator wedges it, panel_action:"unlock" reclaims the lock once it is provably abandoned. This is the SIDEBAR PANEL only; it never touches ComfyUI core or this npm package.

  • action:"self_update" — Check or apply a self-update of the comfyui-mcp NPM PACKAGE (this MCP server), selected by self_update_action (default "status"). The server also auto-checks on start (opt out with COMFYUI_MCP_AUTOUPDATE=0). Detects the install mode: a dev install (npm link / source checkout) is NEVER updated; global/local installs are updated via npm; npx fetches latest on next run. The running process cannot hot-swap its own code — after an update you must RECONNECT (/mcp) or restart the orchestrator to load the new version. This tool does not auto-restart. On Windows the running orchestrator holds its own sharp DLL locked, so an in-place npm replace fails (EBUSY); the update is then handed to a deferred helper that finishes it once the orchestrator has fully stopped, and the new version loads at the next start. A failed update reports npm's own error output. This updates comfyui-mcp ITSELF — not ComfyUI (action:"update"), not the sidebar panel (action:"panel"), and not custom nodes (install_comfyui (action:"update_all")).

  • action:"environment" — Report ComfyUI environment info (mirrors comfy-cli env): the running instance details from /system_stats (OS, Python, ComfyUI version, GPU/VRAM — works for remote targets) plus local probes when a workspace path is available (Python version, git revision, ComfyUI-Manager version, and key pip packages like torch/CUDA). Split installs report local.workspace_path for data/base state and local.code_path for the serving checkout; git follows the code path and Manager follows the data/base root (custom_nodes). The local python probe targets the interpreter the RUNNING server uses (its venv / embedded / standalone python, resolved from the live server), never a bare python on PATH. Degrades gracefully and NEVER guesses: when the correct interpreter can't be confirmed, local.python_probe_trusted is false, local.packages is omitted, and local.python_probe_reason says why — an absent package list means UNDETERMINED, never 'not installed'. READ-ONLY.

  • action:"configure_manager" — Configure ComfyUI-Manager settings, mirroring comfy-cli manager subcommands; manager_setting picks which setting and value its new value. Most settings use the ComfyUI-Manager HTTP API (works against remote ComfyUI); set_network_mode and set_security_level have no HTTP setter and are written to Manager's config.ini (requires a known local ComfyUI path; restart ComfyUI to apply).

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNoaction:"configure_manager" — value for the chosen `manager_setting` (omit only for reset_queue). Allowed values per setting — set_preview_method: auto | latent2rgb | taesd | none; set_db_mode: local | cache | remote; set_component_policy: workflow | higher | mine; set_update_policy: stable-comfyui | nightly-comfyui; set_channel: a channel name (e.g. default); set_network_mode: public | private | offline; set_security_level: strong | normal | normal- | weak. HTTP-API settings take effect live; the config.ini ones (set_network_mode, set_security_level) apply only after a ComfyUI restart.
actionYesWhich install/environment operation to perform. action:"update", action:"update_all" and action:"environment" take no other parameters; action:"install" requires `target_path`; action:"panel" takes `panel_action` (+ `version`/`reason` for a pin); action:"self_update" takes `self_update_action`; action:"configure_manager" requires `manager_setting` (+ `value`).
reasonNoaction:"panel" + panel_action:"pin" only: why the user is pinning (stored with the pin).
use_uvNoaction:"install" — if true, prefer `uv pip install` over plain pip when uv is available on PATH. Falls back to pip if uv is missing. Default false.
versionNoaction:"install" — ComfyUI version to install (comfy-cli semantics): "nightly" (default-branch HEAD), "latest" (newest release tag), or a semantic version like "0.3.40" (checked out as tag v0.3.40). Raw git refs/branches are rejected. Omit to track the default branch HEAD. ALSO used by action:"panel" + panel_action:"pin", where it is the PANEL version to hold at, e.g. '0.11.20' (take it from the installedVersion that panel_action:"status" reports).
target_pathNoaction:"install" — REQUIRED absolute path to the workspace directory to install ComfyUI into. Must be empty or non-existent.
panel_actionNoaction:"panel" — which sidebar-panel operation to run. status: report installed/version/dev-symlink/pin plus a sync assessment (never errors). sync: bring the panel up to what this orchestrator needs — no-ops when already current, WARNS ONLY when pinned, and reports the version re-read from disk afterwards. install: add the panel (nightly). update: pull the latest nightly. Works on either install shape — a git checkout is fast-forwarded, and a Comfy Registry ZIP install (which has no .git) is replaced with a verified fresh clone, keeping the previous copy outside custom_nodes. Success is always re-read from disk. reinstall: uninstall + reinstall (nightly). pin: hold the panel at a version (requires `version`). unpin: clear the pin so a sync can proceed. unlock: recover from a crashed/killed orchestrator's leftover panel operation lock — reclaims it ONLY when it is provably abandoned (older than the stale threshold AND its recorded owner process is dead), and refuses with the observed state otherwise. install/update/reinstall/sync refuse on a dev symlink or an active pin, and require a local workspace (COMFYUI_PATH or the saved default workspace).status
skip_managerNoaction:"install" — if true, do not clone/install ComfyUI-Manager. Default false (Manager is installed).
manager_settingNoaction:"configure_manager" — REQUIRED. Which ComfyUI-Manager setting to change. HTTP API: set_preview_method, set_db_mode, set_component_policy, set_update_policy, set_channel, reset_queue. config.ini fallback: set_network_mode, set_security_level.
self_update_actionNoaction:"self_update" — status: report install mode + current vs latest version + dev-link note (never errors). update: update to the latest published version (refuses on a dev link; no-op when already up to date or for npx).status

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description continuously discloses behavior beyond the schema: it explicitly states it never installs into the MCP server's Python environment, never overwrites an existing install, runs synchronously (blocking), modifies files on disk among side effects, and thaws the swapfile on macOS. It also specifies requirements for existing files and aftermath. Since no annotations are present, this fully carries the transparency burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the description is extremely well structured: each action is a clearly titled bullet with sub-points, and the parameter descriptions are cross-referenced. It is verbose but necessary given the complexity, and every sentence adds value with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is remarkably complete: it covers installation location, dependency management (venv isolation), error handling (no overwrites), platform notes (no Windows support, EBUSY), async vs sync behavior, and even specifies when parameters are required or optional per action. It leaves no ambiguity about side effects (e.g., modifies files on disk, reinstalls requirements) or prerequisites (target path must be empty).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial meaning to parameters: for each action it clarifies which parameters apply, e.g., that target_path must be an empty/nonexistent directory, that python_version selects 3.10/3.11/3.12, that use_uv prefers uv over pip, and that venv is always created inside target_path. It explains the behavior of each parameter in context, going well beyond the schema's brief descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly defines the tool's purpose as installing, updating, and configuring a local ComfyUI installation, its sidebar panel, and the MCP server itself)Skip it clearly differentiates from sibling tools (e.g., install_custom_node, download_model) by naming the specific resources and actions. Each action (install, update, update_all, panel, environment, configure_manager) is clearly scoped with specific verbs and targets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance per action: e.g., action:"install" requires target_path, action:"update" is for local servers only and errors on remote --comfyui-url, action:"configure_manager" requires manager_setting, etc. It also contrasts with sibling tools: 'This updates comfyui-mcp ITSELF — not ComfyUI, not the sidebar panel, and not custom nodes (install_comfyui (action:"update_all")).' This makes the choice among actions and siblings unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

install_custom_nodeA

Install, repair, enable/disable and remove ComfyUI custom node packs on this ComfyUI. To FIND a pack in the public registry first, use search_custom_nodes. Driven by the action parameter:

  • action:"install" — Install a pack by registry id, git URL, or name. Local installs prefer official comfy-cli when available; remote or CLI-unavailable installs use the ComfyUI-Manager HTTP API. A ComfyUI restart may be required. Targeting the comfyui-mcp sidebar panel pack ('comfyui-agent-panel' / 'comfyui-mcp-panel') is routed through the verified install_comfyui(action:'panel') path (the version is re-read from disk afterwards) and is REFUSED while the panel is version-pinned.

  • action:"update" — Update an installed pack, or pass id:'all' to update every installed pack. Local operations prefer official comfy-cli; remote operations use Manager HTTP. Targeting the sidebar panel pack is routed through the verified install_comfyui(action:'panel') path. While the panel is version-pinned, BOTH a direct panel target and 'all' are REFUSED — 'all' would move the pinned panel too; clear the pin with install_comfyui(action:'panel', panel_action:'unpin') or update other packs individually.

  • action:"reinstall" — Reinstall a pack. Local operations prefer official comfy-cli; remote operations use Manager HTTP. A ComfyUI restart may be required. A panel target is routed through the verified install_comfyui(action:'panel') path and is REFUSED while the panel is version-pinned.

  • action:"fix" — Repair a pack's install and Python dependencies, or pass id:'all' to repair every pack. Local operations prefer official comfy-cli; remote single-pack repairs use Manager HTTP. REFUSES the sidebar panel pack — 'fix' has no verified on-disk check, so use install_comfyui(action:'panel') for the panel — and refuses 'all' while the panel is version-pinned.

  • action:"uninstall" — Uninstall a pack (removes it). IRREVERSIBLE through this tool — for a cleanup audit prefer action:"disable", which is reversible. The pack must be one ComfyUI-Manager tracks: an id that resolves nowhere is REFUSED before anything is queued (a drained queue would otherwise read exactly like a success), and a pack that is on disk but unmanaged is named so you can remove its directory yourself. After the queue drains the installed-pack list is re-read and the pack must be GONE before anything claims 'uninstalled'. A ComfyUI restart is required to unload it fully. REFUSES the sidebar panel pack.

  • action:"disable" — Disable an installed pack WITHOUT removing it — the reversible first step of a cleanup (re-enable with action:"enable"; action:"uninstall" removes a pack outright). Uses the ComfyUI-Manager HTTP API (works against remote instances) or official comfy-cli locally, and re-reads the installed-pack list afterwards so a Manager no-op is reported as NOT disabled rather than as success. A ComfyUI restart is required for the change to take effect. REFUSES the sidebar panel pack.

  • action:"enable" — Re-enable a pack previously disabled with action:"disable". Same Manager/comfy-cli mechanics and the same post-op re-read, so a Manager no-op is reported as NOT enabled rather than as success. A ComfyUI restart is required for the change to take effect. REFUSES the sidebar panel pack.

  • action:"list" — List installed packs with their version and enabled/disabled state. Uses the ComfyUI-Manager HTTP API (works against remote instances); the cm-cli fallback returns names only. Read-only.

  • action:"sync_deps" — Reconcile the Python dependencies of ALL installed packs through official comfy node restore-dependencies. Requires a local ComfyUI install and comfy-cli; takes no other parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe pack to act on. REQUIRED for actions "install", "update", "reinstall", "fix", "uninstall", "enable" and "disable". For "install" this is a registry id, git URL, or node-pack name (find one with search_custom_nodes); for "update"/"fix" it may also be 'all' (every installed pack); for "update"/"reinstall"/"fix"/"uninstall"/"enable"/"disable" it is a registry id / module name of an INSTALLED pack.
refNoaction:"install" — git ref (commit SHA, branch, or tag) to pin when installing a git URL. Overrides any ref parsed from the URL and any `version` value. Ignored for registry-id installs.
modeNoTwo distinct meanings, one per action group. For actions "install"/"update"/"reinstall"/"fix": the ComfyUI-Manager data source (default 'remote'); 'remote' fetches the live node list, 'local'/'cache' use bundled/cached data. For action:"list": 'default' lists all installed packs, 'imported' lists only those successfully imported this session. Passing a value from the wrong group is refused, naming the ones the action accepts.
actionYesWhich custom-node operation to perform. "install", "update", "reinstall", "fix", "uninstall", "enable" and "disable" require `id`; "list" and "sync_deps" take no required parameters.
sourceNoaction:"install" — how to interpret `id` (default 'auto', which detects git URLs vs registry ids).
channelNoComfyUI-Manager channel name (default 'default').
versionNoVersion to install. action:"install" — e.g. 'latest', 'nightly', or a semver; for git installs this is treated as a git ref unless `ref` is also provided, and registry installs default to 'latest'. action:"reinstall" — version to reinstall (default 'latest').
useCmCliNoPrefer the official comfy-cli subprocess instead of the ComfyUI-Manager HTTP API. Local operations use comfy-cli by default; set false to force Manager HTTP. Requires a local ComfyUI install — for actions "install"/"disable"/"enable"/"uninstall", an unavailable CLI falls back to Manager HTTP automatically (disclosed in the result); "update"/"reinstall"/"fix"/"list" do not fall back.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: restart requirements, irreversibility of uninstall, pinning refusals, fallback from comfy-cli to Manager HTTP, post-operation re-reads to catch no-ops, and which operations require a local install. This exceeds typical transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but structured with clear bullets per action and front-loaded with the core purpose. Every sentence carries meaningful info, but the sheer volume could be overwhelming; a slightly more concise wording would earn a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 9 actions and 8 parameters, the description covers every action, parameter interactions, edge cases, refusals, fallbacks, and post-operation verification. It is complete even without an output schema, as it tells what results disclose fallback behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds significant meaning: id is defined per action (registry id, git URL, or module name; 'all' for update/fix), mode is explained as two distinct groups, ref/version precedence is clarified, and useCmCli fallback behavior is detailed. This adds far beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb + resource statement: 'Install, repair, enable/disable and remove ComfyUI custom node packs on this ComfyUI.' It clearly distinguishes from siblings by pointing to search_custom_nodes for finding packs and install_comfyui for panel operations, and the action parameter enumerates all operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: use search_custom_nodes to find packs, prefer action:'disable' over 'uninstall' for reversible cleanup, and route panel targets through install_comfyui(action:'panel'). The description also covers when to use each action and when not (e.g., refusing 'all' while a panel is version-pinned).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kitchenA

See what comfy-kitchen can do on this GPU, find where a graph is leaving it on the table, and apply the faster path. Driven by action:

  • action:"status" — kitchen version, backends (hip/cuda/triton/eager), INT8 attention, GPU fp8/NVFP4/MXFP8, launch flags (--use-ck-attention, --enable-triton-backend, --fast fp8_matrix_mult). Local gets log + /system_stats + an import probe when COMFYUI_PATH is set; remote gets log + /system_stats only and reports model.quant / the probe as unknown. A failed probe is unknown, never a no.

  • action:"assess" — walk the workflow JSON's UNETLoaders and emit a recommendation only when every fact it needs is known: (1) weight_dtype default on a bf16 UNETLoader + GPU fp8 + kitchen present → fp8_e4m3fn_fast (widget, no restart); (2) no --use-sage-attention, sageattention not installed, kitchen INT8 available → --use-ck-attention (restart, confirm); (3) Blackwell + local NVFP4 sibling → model swap; (4) ROCm + triton ≥ 3.7 + kitchen, triton backend off → --enable-triton-backend. Pass workflow (API or UI JSON). For the open canvas use panel_kitchen.

  • action:"apply" — apply one recommendation_id from assess. Widget edits are reversible and do not need confirm. Flags and downloads need confirm: true. Flag apply names the launch flag; restart_comfyui replays the previous argv and does not inject a new one. Proof (before/after s/it, peak VRAM, output not black) is the panel_kitchen apply path.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich kitchen operation. "status" takes no other parameters; "assess" takes `workflow`; "apply" takes `recommendation_id` and `confirm` for restarts/downloads.
confirmNoaction:"apply" — required true for anything that restarts or downloads. Widget edits do not need it.
workflowNoaction:"assess" / "apply" — workflow JSON (API-format {id:{class_type,inputs}} or UI-format {nodes,links}), as a string or object.
recommendation_idNoaction:"apply" — id from assess (e.g. "fp8_unet_fast:12" or "ck_attention").

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description takes on the full transparency burden and does so thoroughly. It discloses that local and remote status reporting differ, that a failed probe is reported as unknown rather than no, that assess only emits a recommendation when all facts are known, and that apply requires confirm for restarts/downloads. It even explains restart_comfyui's behavior of replaying previous argv without injecting new flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with a high-level overview followed by bullet per action. Each sentence adds substantive information, though some details like the proof path in panel_kitchen could be trimmed or moved. The format makes it scannable despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action tool with no output schema and no annotations, the description covers operations, parameter requirements, alternatives, and edge cases in depth. The main gap is that it doesn't explicitly describe the exact response/return format for each action, though it implies what each returns (recommendations, status details). Overall it is nearly complete for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context per action: status takes no other parameters, assess takes workflow, and apply takes recommendation_id and confirm. It also clarifies workflow format (API or UI JSON) and gives example recommendation IDs, which goes beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence clearly states the tool's purpose: 'See what comfy-kitchen can do on this GPU, find where a graph is leaving it on the table, and apply the faster path.' The three actions (status, assess, apply) map directly to that purpose, and the description distinguishes it from siblings by focusing on comfy-kitchen-specific features like INT8 attention and fp8 backends.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'For the open canvas use panel_kitchen,' routing to an alternative. It also specifies when to use each action and gives concrete conditions for assess recommendations (e.g., 'bf16 UNETLoader + GPU fp8 + kitchen present → fp8_e4m3fn_fast') and apply requirements (confirm for restarts/downloads vs widget edits). This is explicit when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_api_nodesA

Discover and run hosted partner/API nodes on the connected ComfyUI (e.g. Flux/BFL, Ideogram, Kling, Stability). These call external image/video providers and run server-side, requiring a Comfy account/API key configured on the ComfyUI server — they spend PAID api credits, unlike a local-GPU render. Driven by the action parameter:

  • action:"list" — List the API/partner nodes available on the connected ComfyUI, optionally narrowed by filter. Returns an empty list if the server has no API nodes (or they are disabled). Start here to find a class_type.

  • action:"schema" — Return the input schema for one API/partner node (class_type) from the connected ComfyUI's /object_info. Lists visible inputs (with types/defaults/options), hidden inputs (server-filled auth), and outputs. Use action:"list" first to find a class_type.

  • action:"generate" — Build a minimal single-node workflow that runs a chosen API/partner node (class_type) with the provided inputs and enqueue it. Returns immediately with the prompt_id (use queue (action:"status") / get_history for results). Do NOT pass auth credentials in inputs — the ComfyUI server injects those from its logged-in session. Use action:"schema" to discover valid inputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich API-node operation to perform. "list" takes an optional `filter`; "schema" requires `class_type`; "generate" requires `class_type` + `inputs` (optional `disable_random_seed`).
filterNoaction:"list" — case-insensitive substring to narrow results, matched against class_type, display name, or category (e.g. "image", "video", "kling").
inputsNoaction:"generate" — REQUIRED. Input values keyed by input name, per the node's schema (action:"schema").
class_typeNoThe node class_type, e.g. "FluxProImageNode". REQUIRED for action:"schema" and action:"generate"; find one with action:"list".
disable_random_seedNoaction:"generate" — if true, do not randomize seed/noise_seed inputs.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses safety/behavioral traits: external API calls, server-side execution, required Comfy account/API key, paid credits, immediate return of prompt_id, empty list when disabled, and explicit 'Do NOT pass auth credentials in inputs'. This goes well beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but organized by action bullets, with the core purpose in the first sentence. Each section adds necessary details; slight repetition (e.g., multiple 'Use action' instructions) is acceptable given the multi-action complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-action tool with nested inputs and no output schema, the description covers list results, schema contents, generate's immediate prompt_id return, auth behavior, and credit implications. It is sufficiently complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already covers all five parameters (100%), and the description reinforces action-parameter interdependencies: action:list takes filter, schema/generate require class_type, generate requires inputs and optional disable_random_seed. It also adds semantic detail like filter matching against class_type/display/category.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Discover and run hosted partner/API nodes on the connected ComfyUI') and then enumerates three distinct action modes (list/schema/generate), clearly distinguishing this from sibling tools like generate_image by emphasizing external providers and paid credits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides strong context: 'Start here to find a class_type', 'Use action:list first', 'Use action:schema to discover valid inputs', and explicitly frames generate as enqueuing a remote API run. It doesn't name sibling alternatives as exclusions, but the paid-credit vs local-GPU contrast implies when to prefer this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_local_modelsA

Inspect what models this ComfyUI has installed, and where it looks for them. Driven by the action parameter:

  • action:"list" — List model files available to the connected ComfyUI, grouped by type. Read-only. Queries ComfyUI's /models REST endpoint first (works with remote ComfyUI and respects extra_model_paths.yaml — symlinked / mounted dirs the install-path filesystem scan would miss), then falls back to a filesystem scan of COMFYUI_PATH/models/ when the REST endpoint is unavailable. Size and modified time are only available on the filesystem fallback path. Use to see which models are already available before generating or downloading; use download_model action:"search" to discover new models on HuggingFace, then action:"download" to fetch them. For models fetched via download_model action:"download_civitai", any CivitAI trigger/activation words and base model are shown inline (read from the <file>.civitai.json sidecar) — apply those trigger words in your prompt when generating with that model. A civitai: line under an entry is that model's CivitAI page URL (modelId + INSTALLED modelVersionId, from the same sidecar) — use it to reference the source or check for newer versions.

  • action:"remove" — DELETES a model FILE from the local ComfyUI models directories. path is REQUIRED and is a file path relative to models/. THIS IS DESTRUCTIVE AND HAS NO UNDO: the file is unlinked, not moved to a recycle bin, and a large checkpoint can take hours to re-download — confirm the exact path with the user (action:"list" shows it) before calling. Resolves the path across ALL configured roots — the primary /models AND every directory in extra_model_paths.yaml / extra_models_config.yaml (e.g. models stored on another drive like E:) — the same roots ComfyUI loads from. The path must stay within a known root (path traversal and absolute escapes are rejected), and a directory is refused. LOCAL-ONLY: deletes from the local filesystem, so it is not supported against a remote ComfyUI (remove the file on the host). Do NOT confuse this with action:"remove_path", which edits a config file and deletes nothing.

  • action:"embeddings" — List textual-inversion embeddings installed on the connected ComfyUI server (read from its /api/embeddings endpoint, i.e. the models/embeddings folder). Requires a running, reachable ComfyUI (local or remote); takes no other parameters. Returns the embedding names; reference them in positive or negative prompts as embedding:name (e.g. embedding:easynegative). Read-only.

  • action:"list_paths" — View ComfyUI extra search-path config for standalone/manual installs and ComfyUI Desktop. Read-only. Resolves LIVE-FIRST: the file the running ComfyUI actually reads (its --extra-model-paths-config, else the extra_model_paths.yaml beside its main.py), falling back to the local heuristic only when no server is reachable — /extra_model_paths.yaml (COMFYUI_PATH, else the saved default workspace from workspace action:"set_default") or the Desktop app-data extra_models_config.yaml. Reports generic categories, so model categories and custom_nodes entries are both visible when present. Because it is read-only it never refuses a reachable LOCAL server just because its argv does not prove which file it reads: it shows the server-named config when that file exists here, else the local auto-selected one, always labelled as unconfirmed rather than presented as the live server's. action:"add_path"/action:"remove_path" still refuse in that state — a write to an unproven file would be a silent no-op.

  • action:"add_path" — Add a directory to a ComfyUI extra search-path YAML config; category + path are REQUIRED. Use this for model categories such as checkpoints/loras/vae and, on ComfyUI builds that support it, custom_nodes. Writes the config file and returns the updated view; restart ComfyUI to apply.

  • action:"remove_path" — Remove a directory from a ComfyUI extra search-path YAML config; category + path are REQUIRED. Matches the stored path exactly. This edits the YAML only — it deletes NO model files and frees no disk space (that is action:"remove"). Restart ComfyUI after removing an active path.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoREQUIRED by three actions, and it means two DIFFERENT things — read this before calling. action:"remove": the MODEL FILE to DELETE, relative to the ComfyUI models/ directory (e.g. 'checkpoints/sd_xl_base_1.0.safetensors'); the leading segment is the category used to locate the file in extra roots too. action:"add_path" / action:"remove_path": a DIRECTORY to add to / remove from the extra-search-path YAML for `category` (absolute paths are safest; relative paths are resolved by ComfyUI) — no file is deleted.
groupNoaction:"add_path" / "remove_path" — top-level YAML group to edit. Defaults to comfyui_mcp.
actionYesWhich inventory operation to perform. "list" (optional `model_type`), "embeddings" and "list_paths" are READ-ONLY. "remove" DELETES the model file named by `path` — required, and destructive. "add_path"/"remove_path" edit the extra-search-path YAML and require `category` + `path`; they never touch model files.
targetNoaction:"list_paths" / "add_path" / "remove_path" — config target. auto (default) is LIVE-FIRST: the running ComfyUI's own --extra-model-paths-config, else the extra_model_paths.yaml next to its main.py. When no server is reachable, auto shows the Desktop config if one exists, otherwise standalone. When a reachable LOCAL server does not expose main.py, listing degrades to the server-named config (if it exists here) or the local auto-selected one, explicitly marked as an unconfirmed display fallback; mutations refuse instead. standalone forces <ComfyUI root>/extra_model_paths.yaml, where the root is COMFYUI_PATH (or an auto-detected install) and falls back to the saved default workspace; desktop forces the OS app-data extra_models_config.yaml. Use standalone/desktop (or config_path) to deliberately target a file the running server does not read.
categoryNoREQUIRED for action:"add_path" / action:"remove_path" — the ComfyUI search-path category, e.g. checkpoints, loras, vae, diffusion_models, unet_gguf, or custom_nodes.
is_defaultNoaction:"add_path" — set is_default on a newly-created group. Existing groups are not overwritten.
model_typeNoaction:"list" — filter by model type (e.g. 'checkpoints', 'loras'). Lists all types if omitted.
config_pathNoaction:"list_paths" / "add_path" / "remove_path" — explicit YAML config path override, mainly for advanced/manual installs.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so exceptionally. It flags destructive actions loudly ('THIS IS DESTRUCTIVE AND HAS NO UNDO'), discloses read-only vs mutating actions, explains fallback behavior (REST-first then filesystem), path traversal rejection, directory refusal, remote unsupported for remove, and restart requirements. It also covers edge cases like unconfirmed display fallback and sidecar-based CivitAI metadata. No behavioral trait is hidden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though long, the description earns its length: it covers six actions with clear bullet-like separators, each with relevant warnings and context. The opening line gives an instant summary, and every subsequent sentence delivers specific, non-redundant information. The structure makes scanning easy despite the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 actions, 8 parameters, no output schema), the description is remarkably complete. It describes return behavior for most actions (grouping by type, fallback size/modified time, embedding names, updated config view, generic categories for list_paths) and explains side effects (restart needed, unlink bypassing recycle bin). No critical aspect—safety, scope, or constraints—is left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds substantial semantics beyond the schema. It explains the dual meaning of `path` (model file vs directory per action), how `target` resolves live configs, and that `action` drives the entire behavior. It also describes nuances like path resolution across extra_model_paths.yaml roots and the distinction between deleting a file vs editing YAML, which the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific statement: 'Inspect what models this ComfyUI has installed, and where it looks for them' — a concrete verb+resource+scope. It then enumerates six distinct actions under the same tool, making it obvious what each invocation does. It also distinguishes itself from the sibling download_model tool by pointing users there for searching and fetching new models, avoiding confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided throughout: 'Use to see which models are already available before generating or downloading; use download_model action:"search" to discover new models on HuggingFace, then action:"download" to fetch them.' The description also warns against confusing remove with remove_path, tells users to confirm the exact path before calling remove, and explains when to use standalone/desktop config targeting. Alternatives and exclusions are clearly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_packsA

Bundled ComfyUI knowledge — installer packs, model-family skills, workflow templates — plus the two workflow-readiness checks. Driven by the action parameter:

  • action:"list" — List the bundled installer packs under packs/: one-command setups for a model family (custom nodes + model weights via manifest.yaml) PLUS a ready workflow.json graph. Each entry reports its family/kind, its runtime (these packs are LOCAL-GPU / FREE — they run on the user's own GPU and never spend paid API credits), whether it has a ready workflow + manifest, and the manifest path for install_comfyui apply_manifest. When asked to "set up / build a workflow", PREFER applying the matching pack and loading its ready workflow (panel_load_workflow pack:) over building a generic graph from scratch. Read the ready graph with action:"read_workflow", and inspect its install manifest with action:"read_manifest".

  • action:"read_workflow" — Return a bundled pack's ready workflow.json graph by pack name (name; discover names + which packs have a workflow with action:"list"). This is the EXPERT graph for that model family — use it as the source of truth when setting up the family on the user's canvas: recreate it node-by-node with the panel_* tools (panel_add_node / panel_connect / panel_set_widget) so it lands on their live canvas, or enqueue it headlessly. Prefer this over inventing a graph from scratch. Names are validated (no path traversal) and must match an existing pack directory.

  • action:"read_manifest" — Return a bundled pack's install manifest (its manifest.yaml — the custom nodes + model weights apply_manifest would install) by pack name (name; discover names + which packs have a manifest with action:"list"). READ-ONLY — the way to INSPECT what a pack will install BEFORE calling the mutating apply_manifest. Names are validated (no path traversal) and must match an existing pack directory.

  • action:"list_templates" — List CUSTOM-NODE-contributed ComfyUI workflow templates on the connected ComfyUI, grouped by source (each pack's own example_workflows/*.json). Hits the live server's /api/workflow_templates index. SCOPE LIMIT: this endpoint does NOT include ComfyUI's own core bundled templates from the comfyui-workflow-templates package (e.g. "Flux.1 Inpaint") — those are served to the frontend as static assets via a separate code path this action cannot see, so a small/empty result here does NOT mean no official template exists, only that no custom-node pack contributed one. When asked to "set up / build a workflow", check here for a custom-node-contributed starter AFTER checking the bundled skills + installer packs (action:"skill_list" / action:"list"), and also tell the user to check the ComfyUI frontend's own Templates browser directly for core templates, since this action cannot enumerate those. NOTE: this lists what's available; loading a template onto the canvas is done in the ComfyUI frontend's Templates browser (the panel agent cannot load a template graph headlessly yet) — surface the matching template name to the user.

  • action:"check_runtime" — Determine whether a workflow runs on the user's OWN GPU (LOCAL — free) or uses hosted API NODES (PAID api credits). Pass pack (a bundled pack name — always local/free) OR graph (a UI or API/prompt workflow JSON, as object or string). It scans the workflow's node class_types against the connected ComfyUI's API-node set (the same signal list_api_nodes uses) and returns { runtime: 'local'|'api'|'mixed'|'unknown', usesApiNodes, apiNodes[], externalApiNodes[], unknownNodes[] } — 'unknown' means some nodes couldn't be classified (could be paid), so treat it (and 'api'/'mixed') as POSSIBLY PAID; only 'local' is confirmed free. externalApiNodes is the THIRD-PARTY paid kind (a fal.ai-style pack, or any node taking a service credential): those are INSTALLED LOCALLY yet still cost money, billed by that provider on the user's own account with them rather than out of Comfy api credits — so when you ask the user, name the provider, not "Comfy credits" (externalProviders names it when recognised — e.g. ["fal.ai"]; it is absent when the node was flagged only by taking a service credential, which proves it authenticates somewhere but not to whom). ALWAYS call this before building OR loading a non-pack/ad-hoc workflow so you can ASK the user before spending paid API credits — never silently use API nodes.

  • action:"extract_deps" — Analyze a ComfyUI workflow (workflow, API JSON) and determine which custom node packs it requires. Maps each node class_type to its owning node pack using ComfyUI-Manager mappings and the server's installed node definitions, reporting which packs are installed vs missing. READ-ONLY — it installs nothing. Works remotely (HTTP only) — mirrors comfy-cli node deps-in-workflow.

  • action:"install_deps" — MUTATING: this is the ONE action on this tool that INSTALLS anything. Resolve and INSTALL the custom node packs a ComfyUI workflow (workflow) requires, via ComfyUI-Manager: it determines the missing packs, resets the Manager queue, QUEUES THE INSTALLS, starts the worker, and reports what was installed/already-present/unresolved. Installing a pack downloads and runs third-party code (and may pull large files) on the connected ComfyUI host — local OR remote --comfyui-url — and a ComfyUI restart is typically needed before new nodes load. Use action:"extract_deps" first if you only want to SEE what is missing. Mirrors comfy-cli node install-deps.

  • action:"skill_list" — List the bundled ComfyUI model-family + workflow skills shipped with comfyui-mcp (name + description for each). These encode per-family expertise (e.g. krea2-txt2img: native krea2 CLIPLoader, Qwen3-VL encoder, 8-step turbo settings) and the installer-packs system. Call this BEFORE hand-building a workflow from scratch — if a matching skill exists, read its full guidance with action:"skill_read" and prefer a ready installer pack (action:"list") over a generic graph. Claude loads these natively; this action gives the SAME knowledge to any MCP client (e.g. the Codex backend).

  • action:"skill_read" — Return the full body of a bundled skill's SKILL.md by name (name; discover names with action:"skill_list"). Gives you the family's complete expertise on demand — model slots, node graph, recommended settings, and gotchas — so you can build the right workflow instead of guessing. Names are validated (no path traversal) and must match an existing skill directory.

  • action:"generate_skill" — MUTATING: it WRITES to the read-through skill cache on every cache miss, and when install_in is set it ALSO creates that directory and overwrites any SKILL.md in it. Generate a Claude skill (SKILL.md) documenting a ComfyUI custom node pack: its nodes, inputs/outputs, and example workflows. source accepts a ComfyUI Registry ID (resolved via api.comfy.org) or a GitHub repository URL. Uses a read-through cache under ~/.comfyui-mcp/skill-cache (override COMFYUI_SKILL_CACHE_DIR); set refresh:true to bypass it. On cache miss, fetches the repo README and scans its Python NODE_CLASS_MAPPINGS and example workflows over the network (uses GITHUB_TOKEN if set to avoid rate limits), so internet access is required. If a ComfyUI server is reachable it enriches node input/output types from /object_info, but the server is optional. Returns the SKILL.md markdown with structured cache metadata; if install_in is set, also creates that directory (recursively) and writes SKILL.md there, overwriting any existing file.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoREQUIRED for action:"read_workflow" and action:"read_manifest" — the pack name (a directory under packs/, e.g. 'krea2-txt2img-manual'), from action:"list". REQUIRED for action:"skill_read" — the skill name (a directory under plugin/skills/, e.g. 'krea2-txt2img'), from action:"skill_list".
packNoaction:"check_runtime" — a bundled pack name (from action:"list"). Packs are local/free; this confirms it from the actual graph.
graphNoaction:"check_runtime" — a workflow graph to classify (UI or API/prompt format), as an object or a JSON string. Use this for ad-hoc/generated workflows.
actionYesWhich knowledge operation to perform. "list", "list_templates" and "skill_list" take no other parameters; "read_workflow", "read_manifest" and "skill_read" require `name`; "check_runtime" takes `pack` OR `graph`; "extract_deps" and "install_deps" require `workflow` (and "install_deps" INSTALLS custom nodes — the only action here that installs, though "generate_skill" also WRITES to disk: its skill cache on every miss, plus `install_in` when set); "generate_skill" requires `source` (optional `install_in`/`refresh`).
sourceNoREQUIRED for action:"generate_skill" — a ComfyUI Registry node ID (e.g. 'comfyui-impact-pack') or a GitHub repository URL.
refreshNoaction:"generate_skill" — bypass the read-through cache and rebuild the SKILL.md, overwriting the cached entry.
workflowNoREQUIRED for action:"extract_deps" and action:"install_deps" — a ComfyUI workflow in API format (JSON string or object).
install_inNoaction:"generate_skill" — optional directory to write the generated SKILL.md into. Created recursively if missing; an existing SKILL.md is overwritten. Omit to only return the markdown without touching disk.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does this thoroughly: it flags mutating actions ('MUTATING: this is the ONE action on this tool that INSTALLS anything', 'MUTATING: it WRITES to the read-through skill cache'), notes read-only actions ('READ-ONLY — it installs nothing', 'READ-ONLY — the way to INSPECT what a pack will install BEFORE calling the mutating apply_manifest'), and discloses side effects like 'Installing a pack downloads and runs third-party code (and may pull large files) on the connected ComfyUI host' and 'a ComfyUI restart is typically needed before new nodes load.' It also explains the 'externalApiNodes' nuance and the 'unknown' runtime classification, which is critical for cost transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (over 1000 words) but densely packed with essential information. It is structured with clear action headers and bullet points, making it scannable. Each sentence earns its place: it covers purpose, usage, side effects, and alternatives for each action. However, it is verbose in places, e.g., the 'check_runtime' section repeats the 'externalApiNodes' explanation twice. It could be tightened without losing value, but the structure is exemplary for a multi-action tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (10 actions, 8 parameters, no output schema, no annotations), the description is remarkably complete. It covers all actions, parameter interactions, side effects, cost implications, and alternatives. It even explains the return structure for 'check_runtime' and the 'externalProviders' field. The only minor gap is that it doesn't describe the exact return format for 'list' or 'skill_list', but the output schema is absent and the description gives enough context for the agent to infer. The description fully compensates for the lack of annotations and output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds significant value beyond the schema: it explains the action-specific parameter requirements (e.g., 'action:"check_runtime" takes `pack` OR `graph`'), clarifies the meaning of 'name' for different actions, and provides examples ('e.g. "krea2-txt2img-manual"'). It also explains the 'externalProviders' field in the return value, which is not in the schema. However, some parameter semantics are only implied (e.g., 'refresh' is described in the schema but the description adds the 'bypass the read-through cache' context, which is already in the schema description). The description does not add much for 'install_in' beyond the schema, but overall it enriches the parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Bundled ComfyUI knowledge — installer packs, model-family skills, workflow templates — plus the two workflow-readiness checks.' It enumerates ten distinct actions, each with a specific verb and resource (e.g., 'List the bundled installer packs under packs/', 'Return a bundled pack's ready workflow.json graph'). It distinguishes from siblings by naming alternatives like 'install_comfyui apply_manifest' and 'panel_load_workflow', and by referencing the 'panel_*' tools for canvas operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance for each action. For example, it says 'When asked to "set up / build a <model-family> workflow", PREFER applying the matching pack and loading its ready workflow... over building a generic graph from scratch.' It also gives exclusions: 'SCOPE LIMIT: this endpoint does NOT include ComfyUI's own core bundled templates...' and 'ALWAYS call this before building OR loading a non-pack/ad-hoc workflow so you can ASK the user before spending paid API credits.' It names alternatives like 'action:"extract_deps" first if you only want to SEE what is missing.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_toolsA

List every comfyui-mcp capability as a token-light catalog: tool names with one-line summaries, grouped by category. Start here. Then use describe_tool to get a tool's parameters and call_tool to run it.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoCase-insensitive substring filter over tool names and descriptions.
categoryNoOnly list this category (as shown in the catalog headings).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses the output format (token-light catalog, grouped by category) and implies a read-only, non-side-effect operation. It could mention absence of destructive behavior, but for a list tool this is adequate and adds value beyond raw schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose and output format, second gives workflow guidance. Every word is purposeful, no redundancy, and the most critical information (what and how to start) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with no output schema, this description fully covers what the tool returns (catalog of tool names and summaries), its organization (grouped by category), and the intended next steps. It is complete for the tool's purpose and context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters (search, category) have descriptive text in the schema. The description does not add extra parameter meaning, but it doesn't need to because the schema completely explains them. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool lists every comfyui-mcp capability as a token-light catalog with tool names and one-line summaries, grouped by category. This clearly distinguishes it from siblings by positioning it as the top-level entry point, and precisely names the resource and action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Start here' and then instructs to use describe_tool for parameters and call_tool to run tools, giving explicit sequential guidance on when and how to use this tool relative to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

model_metadataA

Curate a model file's embedded .safetensors metadata (Model Explorer). Driven by the action parameter:

  • action:"read" — Read a model file's CURRENT embedded metadata + evidence, for curating it. Returns classify (asset_type/base/precision/rank), the current model_card and prompt_director namespaces, read-only modelspec, top training tags (ss_tag_frequency), the Civitai description, and example prompts. Call this FIRST when the user wants to improve/curate a model's embedded .safetensors metadata, so you propose from real data. NOTE: this is the embedded-in-the-tensor metadata (model_card/prompt_director/modelspec/ss_*) — NOT the separate lora_catalog. category = ComfyUI model folder ('loras','checkpoints','vae',…); name = filename incl. .safetensors — BOTH required for read/propose, e.g. {action:"read", category:"loras", name:"my_model.safetensors"}. DEPENDENCY: the curated read proxies the OPTIONAL 'comfyui-model-explorer' custom node. When that node is absent but the model file is reachable on the LOCAL filesystem, the tool does NOT hard-fail — it degrades to a structured 'model_explorer: unavailable' result with local evidence (file stat, the download_model action:"download_civitai" sidecar, and the raw embedded safetensors metadata). Without local filesystem access, it still returns the same structured unavailable result, but without file evidence.

  • action:"propose" — PROPOSE cleaned embedded metadata into the user's diff-review window. This does NOT write the file — the user sees your proposed fields vs current, edits/discusses, and their Confirm does the write. Call whenever you have a proposal OR the user asks you to revise one; each call REPLACES the live proposal, so send the FULL field set you're proposing. Include only fields you're confident about. Keys: display_name, description_clean, semantic_intent, prompt_guidance, preservation_guidance, trigger_tokens[] (EXACT tokens — never invent), activation_phrases[], negative_tokens[], tags[], compatible_families[], default_strength_model, default_strength_clip, strength_min, strength_max. NEVER write metadata directly.

  • action:"fetch_civitai" — READ-ONLY: pull this model's data from Civitai (civitai.com) — the rich description, trainedWords, example prompts (with the prompt text used in the sample images), tags, nsfw flag, and source_url — WITHOUT writing anything. Call this when the embedded metadata is thin (empty model_card/prompt_director, no ss_tag_frequency) or to flesh out details before proposing. Treat the result as RAW input: distill the (often marketing-heavy) description, and MINE THE EXAMPLE PROMPTS for the real trigger — the trigger is frequently ONLY in the sample prompts even when trainedWords is EMPTY (e.g. every prompt starting with 'photo in the style of X' means X is the trigger). Adult models (civitai.red) resolve through this same API. Then clean it up and call action:"propose". DEPENDENCY: automatic by-hash lookup uses the OPTIONAL 'comfyui-model-explorer' custom node. If that node isn't installed, pass 'version_id' (the CivitAI modelVersionId) and this action degrades to CivitAI's public REST API directly — no node, no auth. Without both the node AND a version_id it returns a clear 'optional feature unavailable' message rather than enriching.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNomodel filename incl. .safetensors. REQUIRED for all three actions.
noteNoaction:"propose" — optional one-line note about this revision.
actionYesWhich metadata operation to perform. All three actions require `category` + `name`; "propose" also requires `fields` (optional `note`); "fetch_civitai" takes an optional `version_id`.
fieldsNoaction:"propose" — REQUIRED proposed field map (see description).
categoryNoComfyUI model folder, e.g. 'loras'. REQUIRED for all three actions.
version_idNoaction:"fetch_civitai" — force a specific Civitai modelVersionId if hash lookup misses.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden, and it excels: it states read is non-destructive, propose 'does NOT write the file' and 'NEVER write metadata directly,' and fetch_civitai is 'READ-ONLY... WITHOUT writing anything.' It also discloses degradation behavior when the optional node is absent and warns that propose REPLACES the live proposal, requiring full field sets.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but efficiently structured with bullet-pointed actions and bolded key terms. It front-loads the primary purpose and each action gets focused guidance; the density of information justifies the length, though it could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex three-action tool with no output schema, the description is remarkably complete: it enumerates the read return fields (classify, model_card, prompt_director, modelspec, ss_tag_frequency, etc.), describes propose behavior (diff-review window, no write), and details fetch_civitai's data and mining advice. Dependencies and failure modes are explicitly covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, yet the description adds significant meaning beyond schema: it specifies which params are required per action ('BOTH required for read/propose'), provides an example call, explains the `fields` object for propose, and details the `version_id` fallback. It also clarifies that `note` is optional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Curate a model file's embedded .safetensors metadata (Model Explorer).' It clearly distinguishes itself from sibling tools by noting 'NOT the separate lora_catalog' and details three distinct actions (read/propose/fetch_civitai), making its scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use guidance for each action: 'Call this FIRST...' for read, 'Call whenever you have a proposal...' for propose, and 'Call this when the embedded metadata is thin...' for fetch_civitai. It also names a sibling dependency ('download_model action:'download_civitai' sidecar') and clarifies when not to use it via the lora_catalog exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

node_packA

Author, edit, test and publish YOUR OWN ComfyUI custom-node pack under the custom_nodes/ directory the running ComfyUI actually scans. LOCAL-ONLY: it acts on the local filesystem and is meaningless for a remote --comfyui-url target. Every file-touching action (list_files, read, search, write, patch, git) is jailed to custom_nodes/ under the directory the running ComfyUI actually scans — the server's own --base-directory when it reports one (on ComfyUI Desktop that is NOT the code install root), else the live main.py checkout on a split install that has no --base-directory (the data workspace is not scanned unless the flag said so), else COMFYUI_PATH, else the saved default workspace, else the running LOCAL server's own install root; the one exception is action:"publish", which also accepts an explicit path to a pack directory ANYWHERE on this machine and therefore works without COMFYUI_PATH. To INSTALL or update someone else's pack use install_custom_node instead. Driven by the action parameter:

  • action:"scaffold" — Generate a new pack from a template into the local ComfyUI's scanned custom_nodes// (the install base resolves from the running server's --base-directory when it reports one, else the live main.py checkout on a split install, else COMFYUI_PATH, else the saved default workspace, else the running LOCAL server this session is connected to). Writes pyproject.toml (with the [tool.comfy] PublisherId/DisplayName/Icon table the Comfy Registry requires), init.py exporting NODE_CLASS_MAPPINGS / NODE_DISPLAY_NAME_MAPPINGS, and src/nodes.py containing a runnable sample node (INPUT_TYPES/RETURN_TYPES/FUNCTION/CATEGORY), plus .comfyignore and .gitignore. Optionally emits a web/js frontend stub (wiring WEB_DIRECTORY) and a GitHub Actions publish workflow (with_ci). This is the FIRST step of the author loop: scaffold here, then restart_comfyui to load it, test it, and finally action:"publish". Names must be a safe lowercase slug and cannot escape custom_nodes/; an existing non-empty directory is left untouched unless overwrite is true. Requires name and display_name.

  • action:"verify" — Test that a pack actually LOADS in ComfyUI — the middle step of the author loop. Restarts the local ComfyUI and waits for it to become ready, then checks that the pack's node class_types appear in /object_info. A node that fails to import (a missing dependency or a syntax error) simply never registers, so any missing class_types pinpoint a broken pack. Provide class_types explicitly, or a pack name whose init.py declares NODE_CLASS_MAPPINGS (the keys are inferred). Needs a managed local ComfyUI. Set restart:false to check the already-running server without restarting it.

  • action:"publish" — Publish a local pack to the public Comfy Registry (registry.comfy.org) by running comfy node publish inside the pack directory. First validates the pack's pyproject.toml has the required [project].name, [project].version and [tool.comfy].PublisherId (refusing the scaffold placeholder), then publishes using the API key from the REGISTRY_ACCESS_TOKEN environment variable (passed to comfy-cli via the environment, never via logged arguments). This is the LAST step of the author loop and an IRREVERSIBLE, EXTERNAL action: it creates/updates a PUBLIC registry version that this tool cannot undo. Requires comfy-cli installed and REGISTRY_ACCESS_TOKEN set. Give name (a folder under custom_nodes/) or path (an explicit pack directory).

  • action:"list_files" — List the files in one installed pack under custom_nodes// (read-only). Skips .git/, pycache/ and node_modules/. Use this to orient before action:"read" / action:"search" when diagnosing or editing a pack you found via bisect or install_custom_node (action:"fix"). Requires pack.

  • action:"read" — Read a slice of ONE file inside a pack (read-only), with bounded output so a huge file can't flood the context. Returns the requested line range with a truncation notice when clipped; long lines are chunked. Pair with action:"search" to locate the line, then action:"patch" or action:"write" to change it. Requires path.

  • action:"search" — Regex-search custom-node source under custom_nodes/ (read-only). Uses ripgrep when it's on PATH, otherwise a bounded built-in scanner (skips dot-dirs, pycache/node_modules, binary and >1 MiB files). Returns file/line/text matches with per-line and result caps. Use this to find where a node class, import, or error string lives before reading or patching. Requires query.

  • action:"write" — Create or overwrite ONE file inside a pack. Refuses to clobber an existing file unless overwrite is true, and creates parent directories by default. Use for whole-file edits or new files; for surgical edits prefer action:"patch". After writing, run action:"verify" and restart_comfyui to load the change. Requires path and content.

  • action:"patch" — Apply a unified diff to custom-node source under custom_nodes/. Every touched path is jail-checked BEFORE any git call, then the patch is validated with git apply --check and only applied if the check passes (two-phase; never uses --unsafe-paths). Paths are relative to custom_nodes/ and may carry a/ b/ prefixes; works on non-repo packs too. Ideal for surgical edits located via action:"search". Requires patch.

  • action:"git" — Run a git operation inside one pack, selected by git_action (status/diff/log/commit/push). Reads (status/diff/log) are always allowed. Writes (commit/push) require the environment flag COMFYUI_MCP_ALLOW_GIT_WRITES=1 (default OFF) and otherwise return a structured DISABLED_BY_CONFIG refusal so you can self-correct. commit requires a message and stages either the given paths or all pack changes. This is the final step of the author loop after scaffold → write/patch → verify → restart_comfyui, before action:"publish". Requires pack and git_action.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNoaction:"list_files" — optional glob to filter entries (supports *, **, ?), matched against pack-relative paths. action:"search" — optional glob to restrict which files are searched (e.g. '**/*.py').
nameNoPack folder name under <COMFYUI_PATH>/custom_nodes/. REQUIRED for action:"scaffold" — a safe lowercase slug (letters, digits, hyphens, underscores), e.g. 'my-cool-nodes', which becomes the directory under custom_nodes/ and the pyproject [project].name. For action:"verify", the pack whose __init__.py NODE_CLASS_MAPPINGS keys are inferred and checked when `class_types` is omitted. For action:"publish", the pack folder to publish (give this or `path`).
packNoPack folder name under custom_nodes/ (e.g. 'ComfyUI-Manager'). REQUIRED for action:"list_files" and action:"git".
pathNoREQUIRED for action:"read" and action:"write": a pack-relative path under custom_nodes/, e.g. 'MyPack/nodes.py'. For action:"search", the pack-relative directory to search, or '.' for all packs (default '.'). For action:"publish" ONLY, this is instead an explicit absolute path to the pack directory to publish, and it overrides `name` when both are given.
patchNoaction:"patch" — REQUIRED. A unified diff. File headers (---/+++) are read to determine touched paths, which must resolve inside custom_nodes/ (e.g. 'a/MyPack/nodes.py').
pathsNoaction:"git" — pack-relative paths to stage/scope (jail-checked). Defaults to all pack changes.
queryNoaction:"search" — REQUIRED. Regular expression to search for.
actionYesWhich node-pack operation to perform. "scaffold" requires `name` + `display_name`; "list_files" requires `pack`; "read" requires `path`; "search" requires `query`; "write" requires `path` + `content`; "patch" requires `patch`; "git" requires `pack` + `git_action`. "verify" and "publish" have no required parameters — "verify" resolves the pack from `name` (or checks `class_types` directly), "publish" from `name` or `path`.
contentNoaction:"write" — REQUIRED. Full file contents to write.
messageNoaction:"git" — commit message (required for git_action 'commit').
restartNoaction:"verify" — restart ComfyUI before checking so newly-added packs load (default true). Set false to check the live server as-is.
with_ciNoaction:"scaffold" — if true, also generate .github/workflows/publish_action.yml (Comfy-Org/publish-node-action; needs the REGISTRY_ACCESS_TOKEN repo secret) so pushing a pyproject.toml version bump auto-publishes (default false).
categoryNoaction:"scaffold" — node menu category for the sample node (default 'custom').
max_charsNoaction:"read" — maximum characters to return (default 12000, min 500, max 24000 — hard clamps; values outside are silently pulled into range). action:"git" — maximum characters of git output to return (default 12000, min 500, max 24000 — hard clamps the runtime applies; values outside are silently pulled into range).
overwriteNoaction:"scaffold" — overwrite template files in an existing pack directory instead of refusing (default false). action:"write" — overwrite an existing file instead of refusing (default false).
git_actionNoaction:"git" — REQUIRED. Which git operation to run: status/diff/log are read-only; commit/push require COMFYUI_MCP_ALLOW_GIT_WRITES=1. Named `git_action` rather than `action` only because `action` is this tool's dispatch field; the git operation itself is unchanged.
line_countNoaction:"read" — number of lines to return (default 240, max 800).
start_lineNoaction:"read" — 1-based line to start at (default 1).
class_typesNoaction:"verify" — explicit NODE_CLASS_MAPPINGS keys to confirm are registered in /object_info. Takes precedence over inferring from `name`.
create_dirsNoaction:"write" — create missing parent directories (default true).
descriptionNoaction:"scaffold" — short description written to pyproject [project].description.
max_entriesNoaction:"list_files" — maximum entries to return (default 500, max 2000 — a hard clamp). The walk STOPS at this many, so a capped result is not the pack's full file list.
max_resultsNoaction:"search" — maximum matches to return (default 50, max 100). The scan STOPS at this many, so a capped result is not a complete match set.
display_nameNoaction:"scaffold" — REQUIRED. Human-readable name shown in the ComfyUI node menu and the registry listing.
publisher_idNoaction:"scaffold" — your Comfy Registry publisher id, stamped into [tool.comfy].PublisherId. If omitted a placeholder is written that you must replace before publishing.
with_frontendNoaction:"scaffold" — if true, also generate a web/js/<name>.js extension stub and set WEB_DIRECTORY (default false).
case_sensitiveNoaction:"search" — match case-sensitively (default false).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is exceptionally transparent about side effects: publish is flagged as IRREVERSIBLE and EXTERNAL, write refuses to clobber without overwrite, patch is two-phase with jail-checking, git writes require an environment flag and otherwise return a DISABLED_BY_CONFIG refusal, and verify restarts ComfyUI unless restart:false. It also documents environment dependencies (REGISTRY_ACCESS_TOKEN, COMFYUI_MCP_ALLOW_GIT_WRITES). Since no annotations are provided, the description fully carries the transparency burden and does so comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long, but the complexity of a 9-action, 27-parameter tool justifies the depth. It is well-structured with bullet-per-action subsections and consistent formatting. Each sentence carries specific information (e.g., tooling details, file lists, environment variables). While it could be tightened, the verbosity is purposeful and not redundant, so it earns a high but not perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and lack of an output schema, the description is remarkably complete. It explains the full author workflow, return types for each action (e.g., truncated line ranges, match lists with caps), security mechanisms (jail-checking, two-phase git apply), and dependencies. It also covers edge cases (existing directory handling, non-repo packs, case sensitivity). No critical information is missing for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 27 parameters and 100% schema coverage, the description adds substantial meaning beyond the schema's type/nullability. For each parameter it explains context-dependent semantics (e.g., 'path' means pack-relative for read/write/search but an absolute directory for publish; 'name' has different roles across scaffold/verify/publish). It also explains defaults, hard clamps, and precedence (e.g., class_types overrides name). The rich per-parameter explanations fully disambiguate the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly and specifically states the tool's purpose: authoring, editing, testing, and publishing ComfyUI custom node packs. It enumerates nine distinct actions with explicit use cases, and the author-loop framing (scaffold → verify → publish) makes the overall intent unambiguous. The verb+resource structure is precise for each action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance for every action, including the author-loop steps, and explicitly references alternatives such as install_custom_node and bisect. It states conditions for each action (e.g., 'This is the FIRST step of the author loop', 'Use this to orient before action:read/search', 'Requires comfy-cli installed and REGISTRY_ACCESS_TOKEN set'). It also notes when to prefer patch over write. No ambiguity remains about when to invoke this tool versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

node_snapshotA

Custom-node snapshots via ComfyUI-Manager (mirrors comfy node save-snapshot / restore-snapshot). Driven by the action parameter:

  • action:"list" — List the snapshots ComfyUI-Manager knows about. No other parameters. Read-only.

  • action:"save" — Save the current custom-node and version state. With no name, Manager assigns a timestamped snapshot (works against remote instances). Providing name writes a custom-named snapshot file, which requires a local ComfyUI install root (COMFYUI_PATH or a saved default workspace — see the workspace tool) and is unavailable against a genuinely remote ComfyUI.

  • action:"restore" — Restore a previously saved snapshot by name (required). ComfyUI-Manager applies the custom-node changes on the next ComfyUI restart; use action:"list" to find available names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSnapshot name (no extension, no path separators). REQUIRED for action:"restore" (as shown by action:"list"). OPTIONAL for action:"save" — omit to let ComfyUI-Manager assign a timestamped name. Ignored by action:"list".
actionYesWhich snapshot operation to perform. "list" takes no other parameters; "save" takes an optional `name`; "restore" requires `name`.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the read-only nature of list, write behavior for save, the requirement for local install for named saves (unavailable on remote), and that restore applies on next restart. This is thorough and actionable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description uses a well-structured bullet format to cover three actions. Each sentence provides essential information, and the length is appropriate for the tool's complexity without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking output schema and annotations, the description comprehensively covers the tool's operations, constraints, and dependencies (e.g., workspace tool). It leaves little ambiguity about invocation or behavioral expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds meaningful semantics beyond the schema: it explains how `action` drives behavior and clarifies `name` optionality/requirement depending on the action, plus remote/local caveats. This goes well beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as managing custom-node snapshots via ComfyUI-Manager and enumerates three specific actions (list/save/restore). This distinguishes it from sibling tools like install_custom_node and node_pack.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides per-action usage scenarios, including when to omit name for timestamp-named saves, and when a name requires a local install root. It explicitly points to the workspace tool for a prerequisite, giving concrete guidance for when to use each action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

queueA

Inspect and manage the ComfyUI execution queue. Driven by the action parameter:

  • action:"list" — The job running now plus all pending jobs, each with its prompt_id and position. Read-only; requires a reachable ComfyUI server (works against local or remote --comfyui-url). Omits queued workflow payloads by default to keep output small; set include_workflows:true when you need to inspect or edit the exact pending payload. Use this before action:"cancel" (running), action:"cancel_queued"/action:"clear" (pending), action:"move", or action:"edit".

  • action:"status" — Check ONE job by its prompt_id (the id returned by enqueue_workflow). Queries the connected ComfyUI server; requires it to be running. Returns JSON with running, pending, and done booleans, plus optional status_str, error details, and execution_stats from ComfyUI history once the job is done. Also returns text_outputs when the workflow contained text-preview nodes (Preview as Text, ShowText, …) — those produce no image file, so this is the ONLY way to read their result; report that text back to the user. Use action:"list" to see the whole queue at once, and get_history for full output filenames.

  • action:"get_workflow" — The full workflow payload for one PENDING queue item by prompt_id. Read-only. Does not work for the currently running job because ComfyUI cannot safely edit a job after execution starts.

  • action:"move" — Move a PENDING queue item to the front or back by removing it and re-enqueuing its saved workflow payload; position ("front"|"back") is required. The job receives a NEW prompt_id; the old prompt_id is removed. Running jobs cannot be moved.

  • action:"edit" — Edit a PENDING queue item by removing it and re-enqueuing an updated workflow. Provide either a complete replacement workflow or node_inputs patches keyed by node id; position selects where to requeue (default back). The job receives a NEW prompt_id; the old prompt_id is removed. Running jobs cannot be edited.

  • action:"cancel" — Stop the CURRENTLY RUNNING job ROBUSTLY. Sends an interrupt, then WAITS and verifies the job actually stopped — ComfyUI only honors interrupts BETWEEN steps, so a long single step (e.g. a high-res video sampler) can ignore a plain cancel. If the interrupt isn't honored it escalates to freeing VRAM (POST /free) and re-checks; if it STILL won't die it reports the job as WEDGED and tells you to restart_comfyui (an HTTP cancel cannot kill a stuck step). Set clear_pending:true to also drop ALL pending jobs in the same call — the correct "reset the queue" action, since cancelling alone leaves pending jobs that would run next. The partial result is discarded. With prompt_id given, only interrupts the running job when its prompt_id matches; omit to interrupt whatever is currently running. Use action:"cancel_queued" to remove one specific PENDING job instead.

  • action:"cancel_queued" — Remove one specific PENDING job from the queue by prompt_id, then VERIFY the removal against a live /queue read on both sides of it. Only PENDING jobs can be removed this way: ComfyUI silently ignores the request for a job it has already started, so if the job won the race and is now RUNNING this reports isError and tells you the outputs will still be delivered — use action:"cancel" to interrupt that. Also reports isError when the prompt_id was not in the queue at all (it already finished, or was never queued) rather than calling that a removal.

  • action:"clear" — Clear ALL pending jobs from the queue. Does not affect the currently running job.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich queue operation to perform. "list" and "clear" take no other parameters; "status", "get_workflow" and "cancel_queued" require `prompt_id`; "move" requires `prompt_id` + `position`; "edit" requires `prompt_id` (optional `workflow`/`node_inputs`/`position`); "cancel" takes an optional `prompt_id` and `clear_pending`.
positionNoWhere to requeue the job. REQUIRED for action:"move". OPTIONAL for action:"edit" — defaults to back.
workflowNoaction:"edit" — optional complete replacement API-format workflow. If omitted, the existing queued workflow is patched with `node_inputs`.
prompt_idNoThe prompt_id of a job (the id returned by enqueue_workflow). REQUIRED for actions "status", "get_workflow", "move", "edit" and "cancel_queued" (a PENDING queue item for all but "status"). OPTIONAL for action:"cancel" — if given, only interrupts the running job when its prompt_id matches; omit to interrupt whatever is currently running.
node_inputsNoaction:"edit" — optional input patches keyed by node id, e.g. {"3":{"steps":30,"cfg":7}}.
clear_pendingNoaction:"cancel" — also clear ALL pending jobs (recommended when resetting after a stuck/slow render, so a re-queue doesn't stack behind a backlog). Default false.
include_workflowsNoaction:"list" — include each running/pending job's workflow payload and extra_data. Can be large.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden; it delivers extensively: cancel waits and verifies, escalates to /free, reports WEDGED; edit/move re-queue under a new prompt_id; cancel_queued verifies removal and reports race conditions. It also discloses read-only actions and side effects in detail, far exceeding what a typical tool description provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but matches the natural complexity of an 8-action queue management tool. It is well-structured with clear action headers and front-loaded verbs. Some repetition exists (e.g., 'requires a reachable ComfyUI server'), but overall every major section adds necessary behavioral nuance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description explains expected return data for status (booleans, execution stats, text_outputs) and error behaviors for cancel and cancel_queued. It identifies prerequisites, edge cases, side effects, and system interactions (ComfyUI interrupt restrictions) thoroughly for a tool with this many branches.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is already 100%, the description adds crucial semantics beyond the schema: 'include_workflows' can be large, 'clear_pending' is recommended after a stuck render, and 'prompt_id' has different requiredness depending on the action. It clarifies which parameters are optional/required per action, giving the agent actionable usage context not present in the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Inspect and manage the ComfyUI execution queue.' It further enumerates eight distinct actions, each with specific behavior, and clearly differentiates queue operations from related sibling tools like enqueue_workflow, get_history, and restart_comfyui.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance per action, including recommendations like 'Use this before action:"cancel"...' and fallback alternatives like restart_comfyui for wedged jobs. It also clearly distinguishes cancel vs cancel_queued vs clear, and explains when status is the ONLY way to retrieve certain outputs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_issueA

File or triage a GitHub issue for a bug/problem you hit (ComfyUI, a workflow, a model, custom nodes, or comfyui-mcp/its panel). For OUR repos (artokun/comfyui-mcp, artokun/comfyui-mcp-panel) it sends the report to the AI triage worker, which searches existing OPEN and CLOSED issues, version-matches, and either files a new issue, adds context to an existing one, or — if the problem was already FIXED in a newer version than the user runs — answers with the fixing PR + fixed-in version and a recommendation to upgrade (no new issue). It returns that triage result plus an instant check of whether the user is on the latest versions. TIMING: this call BLOCKS while the triage runs — typically a few minutes — and that wait is normal, not a hang. It always returns eventually (every request is time-capped and the poll budget is bounded); on a failing network the caps make that wait longer, but never indefinite. Do not abort a slow call just to retry it: once the worker has accepted the report it keeps triaging on its own — filing, deduping into an existing issue, advising an upgrade, or (rarely) reporting that it could not file — so a blind retry can double-file. If triage outlasts the polling budget the call still returns, with pending:true (and a job_id when the worker gave one — an accepted submit whose acknowledgement was unreadable returns pending without it). If the worker is unreachable it falls back to a prefilled GitHub 'new issue' URL. For third-party repos it returns a prefilled URL to SHARE (it does not auto-file). ALWAYS pass mcp_version and panel_version from the known environment (the env line in your context, e.g. 'mcp=… panel=…') so the worker can tell the user if simply upgrading fixes it — the single most common resolution. Surface the worker's agent_message / upgrade advice to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesIssue body: what happened, steps to reproduce, the exact error text, and environment (GPU/VRAM, ComfyUI version, ComfyUI FRONTEND version, OS) if known. The FRONTEND version is a SEPARATE package from ComfyUI and they move independently — get_system_stats (action:"health") prints both, and for any panel/UI bug it is often the deciding variable. Scrub secrets first.
repoNoowner/repo (default 'artokun/comfyui-mcp'; use 'artokun/comfyui-mcp-panel' for the sidebar panel).
titleYesShort, specific issue title.
labelsNoOptional GitHub label names to prefill.
no_fileNoForce the prefilled-URL path even for our repos (skip the Worker). Rarely needed.
mcp_versionNoThe running comfyui-mcp version (from the env line in your context). Auto-detected if omitted.
panel_versionNoThe running comfyui-mcp-panel (sidebar) version, from the env line in your context, if known.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses the behavioral contract: it blocks for minutes, always returns eventually, warns about double-filing on retry, explains pending:true and job_id behavior, covers fallback to a prefilled URL, and describes what outputs to surface (agent_message/upgrade advice). This goes far beyond a typical description and the absence of annotations makes this transparency essential.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries critical operational detail: timing, retry dangers, fallback paths, and versioning. It is front-loaded with the core purpose and then systematically covers behavioral nuances. While it could be tightened, the length is justified given the tool's complexity and the high stakes of misuse (double-filing).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description explains all possible return scenarios: triage result, pending flag, job_id, prefilled URL, and agent message. It also covers edge cases like unreachable worker and third-party repos. For a tool with this many parameters and complex asynchronous behavior, the description is exceptionally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all 7 parameters with 100% coverage, so the baseline is 3. The description adds valuable semantic context by insisting on passing mcp_version and panel_version from the environment, detailing the body's required contents (exact error text, frontend version), and clarifying repo choices. This extra guidance elevates it to a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'File or triage a GitHub issue for a bug/problem you hit', naming the resource (GitHub issue) and distinguishing it from all sibling tools (none are issue-related). It further details the triage behavior for our repos versus third-party repos, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when to use the tool (for bugs/problems in ComfyUI ecosystems) and gives detailed scenario-specific guidance: for our repos it uses the AI triage worker, for third-party repos it returns a shareable URL. It also provides strong operational guidance like 'ALWAYS pass mcp_version and panel_version' and warns against blind retries. It does not explicitly mention alternative tools, but the context is strong enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restart_comfyuiA

Control the lifecycle of the ComfyUI server process. Driven by the action parameter:

  • action:"restart" — Restart ComfyUI: stops the running process (capturing its config), waits for the port to free, relaunches with the same arguments, and polls the API for bounded readiness. Also works against a REMOTE/tunnelled ComfyUI (via --comfyui-url) by rebooting through ComfyUI-Manager over HTTP and polling for it to come back (requires ComfyUI-Manager present and its security level permitting the reboot). When COMFYUI_RESTART_COMMAND is set, a LOCAL restart runs that command instead of kill+relaunch — the recovery path for an externally managed install (a container, a systemd unit, a launcher) whose launch path cannot be proven from here. This is the normal way to reload newly installed custom nodes, and the escalation when queue (action:"cancel") reports a job WEDGED.

  • action:"start" — Start ComfyUI using process info saved from a previous action:"stop" call. Supports both Desktop app and manual Python installs. Polls the API for bounded readiness before reporting ready. Local installs only.

  • action:"stop" — Stop the running ComfyUI process. Captures process info so it can be restarted with action:"start". Kills the process tree and resets the WebSocket client. Local installs only. Anything queued or rendering is lost.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich process operation to perform. None of them takes any other parameter. "restart" stops and relaunches in one call (and is the only action that also works against a remote/tunnelled ComfyUI); "start" relaunches from the info a previous "stop" saved; "stop" kills the running process tree.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations, the description carries full burden and delivers: it discloses destructive behavior ('Kills the process tree', 'Anything queued or rendering is lost'), operational sequencing (captures config, waits for port free, polls for bounded readiness), and preconditions ('requires ComfyUI-Manager present and its security level permitting the reboot'). This level of side-effect and failure disclosure is exemplary for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is logically organized by action and front-loaded with 'Control the lifecycle of the ComfyUI server process', but it is dense, with deeply nested clauses and a bulky middle paragraph on the restart path that mix remote behavior, env vars, and recovery rationale. The leading dash and double-hyphen formatting is also slightly awkward. It earns its length better than most, but tighter scoping would help scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a side-effecting control tool with three actions, local/remote differences, an env-var override, and a reference to the sibling 'queue' tool, the description covers the operational surface remarkably well: prerequisites, side effects, failure modes, and boundaries (bounded readiness, local-only for start/stop). The only gap is that no return/response format is described, though for a fire-and-forget process control tool this is a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single 'action' parameter, so the 3-baseline applies, but the description goes well beyond the schema by explaining consequences of each enum value (remote vs local applicability, state persistence across stop/start, readiness polling) and the environment-variable override behavior. The schema's own param description is also solid, making this a well-covered parameter end-to-end.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource — 'Control the lifecycle of the ComfyUI server process' — and enumerates three clearly bounded actions (restart, start, stop) with distinct behavioral contracts. The trigger conditions (reload custom nodes, WEDGED job escalation, externally managed installs) distinguish this lifecycle tool from siblings like 'queue' or 'comfy_cli' without needing to name them all.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames when each action is appropriate: restart is 'the normal way to reload newly installed custom nodes' and 'the escalation when queue (action:"cancel") reports a job WEDGED', explicitly naming the sibling tool. It also gives conditional alternatives (COMFYUI_RESTART_COMMAND for containers/systemd, ComfyUI-Manager over HTTP for remote) with exact prerequisites, leaving no doubt which path applies where.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

runpodA
Destructive

Deploy, start, stop, inspect and connect to RunPod cloud GPU pods, and switch rendering between your local machine and a pod. Driven by the action parameter. SPENDS MONEY: action:"create" and action:"start" put a pod into a billing state; action:"stop" ends GPU billing. Confirm with the user before creating or starting a pod, and stop pods when the work is done.

  • action:"create" — Deploy a BRAND-NEW RunPod pod from our comfyui-mcp template (image with the panel + Manager + our nodes preinstalled), then it can be started/connected like any pod. One-tap alternative to the console deploy link for a user who already has a RunPod account + API key. Because our template is used, the agent can install the user's exact custom nodes/LoRAs + download models on it → full canvas parity. Tries several GPU types until one has capacity (on-demand availability fluctuates). NOTE: this bills GPU-time as soon as the pod boots — confirm with the user first, and stop it (action:"stop") when done. Created pods carry a DEAD-MAN SWITCH: if comfyui-mcp stops minding the pod (crash/offline), the pod STOPS ITSELF after a grace period so it can't bill forever — it uses the pod-scoped key RunPod auto-injects, so your account key never leaves this machine (disable with deadman:false). For onboarding a NEW RunPod user, prefer action:"deploy_link" so their signup credits our referral.

  • action:"start" — Start (resume) a stopped/exited RunPod pod by ID — RunPod re-attaches a GPU and boots the container (billing resumes). Returns immediately once RunPod accepts the resume; the pod then takes ~30-90s to become reachable, so follow with action:"status" (or action:"connect", which verifies readiness) rather than assuming it's instantly up. If RunPod can't allocate the requested GPU it errors — try a different gpu_count or GPU type in the console.

  • action:"stop" — Stop a running RunPod pod by ID — releases the GPU and stops GPU-time billing while KEEPING the pod and its disk (so you can start it again later). Use when the user is done rendering. Does NOT terminate/delete the pod (that's a console action). Confirm with the user before stopping a pod that has work in progress.

  • action:"status" — Get the live state of a pod by ID: its desired status (RUNNING / EXITED / TERMINATED), GPU, uptime, $/hr cost, GPU/VRAM utilization, and — when it's running and exposes ComfyUI — the proxy URL to connect to. Call this first to see what state a pod is in before starting/stopping/connecting. Read-only.

  • action:"list" — List all RunPod pods on the account (id, name, status, GPU, cost). Use when the user hasn't given a pod ID, or to find the one they mean. If the account has no pods, tell the user to create one and share action:"deploy_link". Read-only.

  • action:"connect" — Connect comfyui-mcp to a pod's ComfyUI so ALL the other comfyui tools (generate, workflows, models, panel, …) run against that pod. Give it a pod ID: it verifies the pod is RUNNING with ComfyUI reachable, resolves the pod's proxy URL, and retargets this orchestrator's ComfyUI client to it. If the pod isn't ready it tells you what's missing (run action:"start" / runpod_watch action:"troubleshoot" first). This is the 'live connection' — after it succeeds, the rest of the session talks to the pod.

  • action:"use_local" — Switch comfyui-mcp back to the LOCAL ComfyUI on this machine (the 'Local' half of the local⇄pod switch) — retargets rendering to loopback so generate/workflows run on the local GPU again. Stops broadcasting the pod's status but does NOT stop the pod itself (use action:"stop" to end billing). Use when the user wants to render locally again after working on a pod.

  • action:"deploy_link" — Get the RunPod DEPLOY link for spinning up a NEW comfyui-mcp pod. Share this with the user whenever they have no pod, or want to create one — it opens RunPod pre-configured with our template AND carries our referral code, so their signup/spend credits us. Prefer handing over THIS link for pod creation (rather than describing the console steps), so the referral attaches. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoaction:"create" — pod name (default 'comfyui-mcp').
actionYesWhich RunPod operation to perform. "start", "stop", "status" and "connect" require `pod_id`; "create" takes the optional deploy parameters (name/gpu_type/cloud_type/connect/deadman); "list", "use_local" and "deploy_link" take no other parameters. "create" and "start" BILL; "stop" ends billing.
pod_idNoThe RunPod pod ID (from console.runpod.io, or action:"list"). REQUIRED for actions "start", "stop", "status" and "connect". Ignored by "create", "list", "use_local" and "deploy_link".
connectNoaction:"create" — auto-connect when booted: the ORCHESTRATOR waits for ComfyUI to answer (1-3min), then retargets + watches — this call returns immediately (default false: deploy only; connect later with action:"connect"). This is the create-time flag, NOT the action of the same name.
deadmanNoaction:"create" — arm the pod-side dead-man watchdog (default true for OUR stock template): the pod STOPS ITSELF if comfyui-mcp's heartbeats stop (process crash/offline — boot grace ~45min, then ~20min without beats). Uses the pod-scoped API key RunPod auto-injects into every pod — your account key never leaves this machine. false deploys without the watchdog. With a custom template (RUNPOD_TEMPLATE_ID) the default is OFF — pass true only if that image ships our watchdog.
gpu_typeNoaction:"create" — GPU type to prefer, e.g. "NVIDIA GeForce RTX 4090". Default tries: NVIDIA GeForce RTX 4090, NVIDIA RTX A6000, NVIDIA RTX PRO 4500 Blackwell, NVIDIA A40, NVIDIA RTX A5000.
gpu_countNoaction:"start" — GPUs to attach on resume (default 1).
cloud_typeNoaction:"create" — COMMUNITY (cheaper, default) or SECURE.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations (openWorldHint, idempotentHint:false, destructiveHint:true) by disclosing billing states ('create and start BILL; stop ends billing'), the dead-man switch mechanism (auto-stop if heartbeats cease, user API key never leaves machine), that stop keeps the disk and is reversible, and that connect retargets but does not stop the pod. It also notes the ~30-90s boot delay and the need to follow with status/connect, adding rich behavioral context not present in structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the description is meticulously structured with a leading 'SPENDS MONEY' warning and per-action bullets that are each information-dense but not redundant. Every sentence adds operational value—billing implications, readiness checks, referral economics, dead-man behavior. It is front-loaded with the most critical safety notice and organized for fast scanning, so despite its length it is efficient and well-earned.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex 8-action, 8-parameter tool with no output schema, yet the description covers all actions, their prerequisites, side effects, required follow-ups, and sibling tool references. It explains return behavior (e.g., status returns desired status, GPU, cost, proxy URL; create tries multiple GPU types) and operational flows (deploy link → create → connect → use_local). The description is self-sufficient for correct tool invocation and session management.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds practical parameter semantics by mapping each parameter to its applicable action and clarifying side effects (e.g., connect flag is create-time only, deadman default true for stock template, gpu_type fallback list). The schema already documents parameters well, but the description reinforces which combinations matter and what happens at the orchestration level, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource combination: 'Deploy, start, stop, inspect and connect to RunPod cloud GPU pods, and switch rendering between your local machine and a pod.' It clearly distinguishes the tool from siblings like runpod_watch by enumerating the exact action-driven operations and noting it is the main pod manager, not a watcher/troubleshooter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance for every action, including exclusions and alternatives: e.g., 'For onboarding a NEW RunPod user, prefer action:"deploy_link"', 'Call this first to see what state a pod is in before starting/stopping/connecting', and 'If the pod isn't ready it tells you what's missing (run action:"start" / runpod_watch action:"troubleshoot" first).' It also warns about billing and confirmation requirements, giving clear operational guardrails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

runpod_watchA

Watch a RunPod pod's live status in the control panel, stop watching it, or diagnose why it isn't usable. Driven by the action parameter. None of these actions DEPLOYS or resumes a pod — the runpod tool does that. One of them CAN stop one, though: action:"watch" arms the idle auto-stop, so a watched pod whose ComfyUI sits idle past the configured timeout is stopped to save cost. Do not watch a pod that is deliberately idle but must stay up.

  • action:"watch" — Start broadcasting a pod's LIVE status to the control panel (desktop + mobile) — status, GPU/VRAM utilization, uptime, $/hr, and an idle-auto-stop countdown — refreshed every ~15s. runpod action:"connect" already starts this for the pod it connects to; call this to watch a pod WITHOUT retargeting comfyui-mcp at it (e.g. monitor a pod that's still booting). While watched, if the pod's ComfyUI sits idle past the configured timeout it is auto-stopped to save cost.

  • action:"unwatch" — Stop broadcasting a pod's live status to the control panel (does NOT stop the pod itself — use runpod action:"stop" for that). Also disables idle auto-stop for it.

  • action:"troubleshoot" — Diagnose why a RunPod pod isn't usable — call this when the pod 'won't connect', ComfyUI is unreachable, or a render can't reach the pod. Checks: does the pod exist, is it RUNNING (vs stopped/exited — then start it), is a GPU attached, is ComfyUI's port exposed as an HTTP proxy port, and does ComfyUI actually ANSWER at its proxy URL (probes /system_stats). Returns the specific blocker and the next step. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich watch operation to perform. "watch" and "troubleshoot" require `pod_id`; "unwatch" takes no other parameters (it clears whichever pod is currently watched).
pod_idNoThe RunPod pod ID. REQUIRED for actions "watch" and "troubleshoot". Ignored by "unwatch", which clears the single currently watched pod.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the safety and behavior burden. It discloses that `watch` arms idle auto-stop and can stop a pod, `unwatch` disables auto-stop, and `troubleshoot` is read-only with a specific checklist. It even notes the ~15s refresh rate, giving the agent a clear picture of side effects and operational behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every sentence earns its place by adding safety, usage, or action-specific detail. The structure is clear: a one-sentence purpose, a prominent warning, then bulletized action definitions. It is front-loaded with the most important caveat about not deploying/resuming pods.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the multi-action nature, the absence of output schema, and the interaction with sibling tools, this description is remarkably complete. It covers prerequisites (runpod tool for deploy/resume), action-specific behavior, parameter dependencies, and what `troubleshoot` checks and returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% parameter coverage and documents the `pod_id` dependency on `action`. The description adds value by giving each `action` enum value a concrete semantic meaning (e.g., watch starts broadcasting, unwatch clears the watched pod), but it does not significantly exceed the schema's structural information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Watch a RunPod pod's live status in the control panel, stop watching it, or diagnose why it isn't usable.' It distinguishes itself from the sibling `runpod` tool by explicitly stating that it does not deploy or resume pods, so the agent can select this tool without confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance for each action: use `watch` to monitor a pod without retargeting comfyui-mcp, use `troubleshoot` when a pod 'won't connect' or ComfyUI is unreachable, and use `runpod action:"stop"` for stopping a pod. It also warns not to watch a deliberately idle pod that must stay up, providing clear exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_workflowA

WRITE to the ComfyUI user library: persist a workflow, or capture/verify its provenance lock. This is the only tool here that writes — reading is get_workflow. Driven by the action parameter:

  • action:"save" — Save a workflow JSON to the connected ComfyUI server's user library so it appears in the ComfyUI web UI. Requires a running ComfyUI server; this writes to that server's userdata and OVERWRITES any existing file with the same filename without confirmation. Web-UI-format JSON ({ nodes: [], links: [] }) is saved as-is and is the preferred input — when re-saving an existing workflow, load it with get_workflow (action:"get", format='ui') and modify THAT. API-format graphs ({ '1': { class_type, inputs } }) are AUTO-CONVERTED to Web UI format with a generated layout so the saved file always opens in the ComfyUI canvas (the canvas cannot open raw API format). Returns a confirmation message (noting the conversion and any warnings), or the HTTP status and error text on failure.

  • action:"lock" — Capture a provenance lock for a saved workflow so it can be exactly reproduced later. Walks the workflow's model loaders (CheckpointLoaderSimple, UNETLoader, VAELoader, LoraLoader, ControlNetLoader, etc.), SHA-256s every referenced model file, records the git commit currently checked out for every custom node pack the workflow's class_types come from, and captures ComfyUI's reported version. WRITES <filename>.lock.json next to the workflow in ComfyUI's user library. Requires local filesystem access: models resolve from the data/model roots, and pack commits inspect custom_nodes on the live --base-directory / COMFYUI_PATH data root (not COMFYUI_CODE_PATH). Pair with action:"verify_lock" later to detect drift.

  • action:"verify_lock" — Compare a saved workflow's lock file against the current state of the local install and report drift. Loads <filename>.lock.json, re-computes a current lock from the same workflow, and diffs: which models have a different SHA-256, which custom node packs are on a different commit, whether ComfyUI's version changed. Use before re-running an important workflow days or weeks later to confirm it'll behave the same. Supports split local installs (models and packs stay on the data/base root). Read-only; returns a structured drift report (empty arrays everywhere mean perfect parity).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich write/provenance operation to perform. All three require `filename`; "save" also requires `workflow`.
filenameNoWorkflow filename in the ComfyUI user library (e.g. 'my_workflow.json'). REQUIRED for every action. For action:"save" this OVERWRITES an existing file of the same name; for "lock"/"verify_lock" the lock is read/written as '<filename>.lock.json' alongside it.
workflowNoaction:"save" (REQUIRED) — Workflow JSON to save. Web UI format ({ nodes: [], links: [] }) is stored verbatim; API format ({ '1': { class_type, inputs } }) is auto-converted to Web UI format (generated layout) so it stays openable in ComfyUI's canvas. Not validated against the server before saving.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses side effects: overwriting without confirmation, auto-conversion of API format, requirement for a running server and local filesystem access for locks, and read-only behavior for verify_lock. It mentions return values and failure modes, covering behavioral traits comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but well-structured with bullet points per action. Every sentence contributes useful detail (requirements, side effects, return types). It's verbose due to tool complexity but remains clear and front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, it thoroughly describes return values (confirmation message, drift report with empty arrays meaning parity) and prerequisites (running ComfyUI, local FS access). It covers all necessary context for correct invocation without relying on external docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful semantics beyond schema: e.g., explains why Web UI format is preferred, the auto-conversion behavior, and lock file naming convention. This enriches parameter understanding without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool writes to ComfyUI's user library, persists workflows, and captures/verifies provenance locks. It explicitly differentiates from sibling tools: 'This is the only tool here that writes — reading is get_workflow.' Each action (save, lock, verify_lock) is defined with precise verbs and resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use each action and contrasts with alternatives. For example, it advises loading existing workflows with get_workflow and modifying them rather than recreating, and pairs lock with verify_lock for drift detection. It also clarifies read-only nature of verify_lock.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_custom_nodesA

Discover ComfyUI custom node PACKS in the public ComfyUI Registry (registry.comfy.org). Read-only and network-only: queries the hosted registry over HTTP and does NOT require a running ComfyUI or COMFYUI_PATH. This searches node PACKS, not models (use download_model action:"search") and not local installs (use list_local_models action:"list"). To actually install what you find, or to manage packs already installed, use install_custom_node. Driven by the action parameter:

  • action:"search" — Search by keyword; query required. Returns a ranked list of packs with id, name, author, install count, and latest version. The keyword search ranks a fixed window of packs client-side, so when it matches nothing the query is also tried as an exact registry id automatically (e.g. 'comfyui kjnodes' → 'comfyui-kjnodes'). Pass a returned id to action:"details" for full info, or to install_custom_node (action:"install").

  • action:"details" — Full details for ONE pack by its exact registry id: description, author, license, repository, install count, latest version, the node types it provides, and recent version changelogs. Look up the id via action:"search" first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoaction:"details" — REQUIRED. Exact registry pack id (the 'id' field from action:"search"), e.g. 'comfyui-impact-pack'.
pageNoaction:"search" — page number for pagination (default 1).
limitNoaction:"search" — max results to return (default 10).
queryNoaction:"search" — REQUIRED. Keyword(s) to match against pack name/description, e.g. 'impact', 'controlnet aux'.
actionYesWhich registry lookup to perform. "search" requires `query` (and takes optional `limit`/`page`); "details" requires `id`.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: read-only, network-only, HTTP-based, no local ComfyUI dependency, client-side ranking of a fixed window, and automatic fallback to exact registry ID when no keyword match. It also details the two action modes (search vs details) and their respective behaviors, going well beyond a simple 'search' label.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is substantial but well-organized: front-loaded with the main purpose, followed by key constraints, then a structured breakdown of the two actions. Each sentence serves a purpose, and the action parameter is clearly explained with examples. Despite its length, it avoids redundancy and is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains return values for both actions: search returns a ranked list with specific fields (id, name, author, install count, latest version), and details returns full pack info including node types and changelogs. It also covers prerequisites (network-only, no local ComfyUI) and points to related tools, making it complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 100% of parameters with descriptions, so baseline is 3. The description adds semantic value by explaining the action workflow (search first, then pass id to details), the relationship between query and id, and the meaning of pagination defaults. This extra context raises the score above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Discover ComfyUI custom node PACKS in the public ComfyUI Registry' with a specific verb and resource. It also distinguishes from siblings by explicitly excluding models (download_model) and local installs (list_local_models), making the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-not-to-use guidance: 'Read-only and network-only... does NOT require a running ComfyUI or COMFYUI_PATH'. It names alternatives for models and local installs, and instructs to use install_custom_node for installing or managing packs, offering clear decision paths.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

train_doctorA

Preflight and set up the TRAINER ITSELF — the docker/GPU/venv machinery every training job needs. Touches no dataset and no job. Driven by the action parameter:

  • action:"doctor" — Preflight the local trainer: docker daemon reachable, --gpus all GPU passthrough working (NVIDIA Container Toolkit), trainer image built. Read-only, takes no other parameters. Returns per-check booleans + setup hints. Also reports the training data root and whether HF_TOKEN is set (needed to download FLUX.1-dev on first run), the native (dockerless) bootstrap status, and the connected pod. Run this first when a training start fails.

  • action:"bootstrap" — Set up the NATIVE (dockerless) trainer on this machine (target 'local', the default) or on a pod (target 'pod', optional pod_id): clone ai-toolkit at the pinned commit, create its venv, install torch + requirements. One-time per machine/pod (~10 min fresh, idempotent; a pod's /workspace persists it across restarts). Needed before a target 'pod' train_start on a fresh pod (no docker there). Long-running.

  • action:"build_image" — Build the headless GPU trainer image (comfyui-mcp-trainer:latest) from docker/trainer/Dockerfile — one-time, several minutes (CUDA + torch + ai-toolkit). Requires a reachable docker daemon. aiToolkitRef pins the ai-toolkit commit/tag for reproducibility. The docker alternative to action:"bootstrap".

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhich trainer-setup operation to perform. "doctor" is read-only and takes no other parameters; "bootstrap" takes `target` (+ `pod_id` for target 'pod'); "build_image" takes an optional `aiToolkitRef`. None of them touches a dataset or a job.
pod_idNoaction:"bootstrap" — pod to bootstrap (target 'pod'). Default: the connected pod.
targetNoaction:"bootstrap" — where to install the native trainer. Default local.local
aiToolkitRefNoaction:"build_image" — ai-toolkit git ref (commit/tag) to build against. Default: the Dockerfile's pinned ref.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses read-only status of 'doctor,' idempotency and time cost of 'bootstrap,' and docker-daemon requirement for 'build_image.' It also notes side-effect boundaries ('Touches no dataset and no job') and environment details (HF_TOKEN, NVIDIA Container Toolkit). Lacks explicit failure/error behavior, but this is already generous.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but organized by action with bullet-style formatting. Every sentence contributes operational detail (prereqs, timing, idempotency), though it could be tightened without losing information. Front-loaded with the core purpose before diving into actions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 4 parameters, 3 action modes, and no output schema, the description is remarkably complete. It covers purpose, when to use each action, prerequisites, runtime expectations, and what is touched/not touched. This is more than sufficient for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, giving a baseline of 3, but the description goes well beyond by explaining each action's parameter interplay, defaults, and constraints. For example, it clarifies that 'doctor' takes no other parameters, 'bootstrap' takes target/pod_id, and 'build_image' takes aiToolkitRef with default behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's role: 'Preflight and set up the TRAINER ITSELF — the docker/GPU/venv machinery every training job needs.' It further distinguishes from siblings by explicitly saying 'Touches no dataset and no job,' marking it as distinct from training job and dataset tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Run this first when a training start fails' and 'Needed before a target "pod" train_start on a fresh pod.' It also frames the build_image action as 'The docker alternative to action:"bootstrap"' with actionable prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

train_prepare_datasetA

Stage and curate the training DATASETS a LoRA run consumes — the images and their captions. Datasets are keyed by name; the jobs that train on them live in the separate train_start tool and are keyed by id. Driven by the action parameter:

  • action:"prepare" — Stage training images + captions into a dataset dir the trainer consumes. Each item is an image (absolute path, OR a ComfyUI ref {filename,subfolder?,type?} resolved against the connected ComfyUI's output/input dirs — how phone/panel pickers hand over selections) with an optional caption (a missing caption falls back to defaultCaption — typically the trigger word). Requires name + items. Returns the datasetPath to pass to train_start (action:"start"). Character LoRA guidance: 10-30 varied images; caption what changes between images, keep the trigger word constant.

  • action:"list" — List staged datasets, newest-first, with image/caption counts. Read-only, takes no other parameters. Pair with action:"detail" to see one dataset's images + captions.

  • action:"detail" — Show ONE staged dataset by name: its dir (datasetPath — reusable as train_start's datasetPath) and every image with its caption (null when uncaptioned). Images render via action:"file". Read-only.

  • action:"update" — Edit a staged dataset by name: set/replace per-image captions (setCaptions) and/or delete individual images with their caption files (deleteImages). Refuses while a running/queued job trains from it. Returns per-file warnings for unknown files. This is the SURGICAL edit — it removes only the filenames you list, leaving the dataset itself in place.

  • action:"delete" — DESTROY a whole staged DATASET by name: every image and every caption under it. Irreversible, and the images are typically hand-curated and unrecoverable — confirm with the user first. Refuses while a running/queued job trains from it. THIS DELETES A DATASET, NOT A TRAINING JOB: to delete a finished job's record and checkpoints use the separate train_start tool with action:"delete", which is keyed by id rather than name. To remove only SOME images, use action:"update" with deleteImages.

  • action:"file" — Fetch an image under the training root (dataset image, job sample) by absolute path as an inline image — the tunnel-safe way for a phone/panel to render training files it can't reach over /view. Bounded: image files only, ≤ 2MB.

  • action:"caption_image" — Caption ONE image by absolute path with the user's own Claude subscription (one vision turn through the Agent SDK — not a paid API). Returns the bare caption and does NOT write it — review, then save with action:"update", or use action:"caption_dataset" to write directly. Optional guide steers the style; optional trigger is prepended by the model.

  • action:"caption_dataset" — Caption a whole staged dataset by name (or the only subset) with the user's own Claude subscription and WRITE the captions into its .txt files (one vision turn per image, sequential). Captioning ALWAYS runs through Claude (Agent SDK) regardless of the panel's active backend, so it needs a logged-in Claude Code session (or ANTHROPIC_API_KEY). Use after gathering images, before train_start (action:"start"). Per-file transient failures are reported without stopping the batch, but a persistent auth/credential failure stops immediately with an actionable error rather than failing every image. Optional guide steers all captions; optional trigger is prepended to each.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoDataset name — the staging dir name. REQUIRED for actions "prepare" (it is created), "detail", "update", "delete" and "caption_dataset" (from action:"list"). This is a DATASET name, never a training job id.
onlyNoaction:"caption_dataset" — subset of filenames to caption (default: all images).
pathNoAbsolute path of a file under the training root. REQUIRED for action:"file" (a dataset image or job sample, from action:"detail"'s datasetPath or train_start action:"status"'s samples) and for action:"caption_image" (the image to caption).
guideNoactions "caption_image"/"caption_dataset" — extra style guidance for the captioner (e.g. 'focus on outfits and backgrounds').
itemsNoaction:"prepare" — the images to stage. REQUIRED for that action.
actionYesWhich dataset operation to perform. "list" takes no other parameters; "prepare" requires `name` + `items`; "detail", "update", "delete" and "caption_dataset" require `name`; "file" and "caption_image" require `path`. NOTE "delete" here destroys a DATASET (images + captions) — deleting a training JOB is train_start action:"delete".
triggerNoactions "caption_image"/"caption_dataset" — trigger word to prepend to the caption(s).
setCaptionsNoaction:"update" — {filename: caption} pairs to write (replaces existing captions).
deleteImagesNoaction:"update" — image filenames to delete from the dataset (caption files go too). Removes only these files; action:"delete" removes the whole dataset.
defaultCaptionNoaction:"prepare" — fallback caption for items without one; usually the trigger word.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses destruction ('DESTROY a whole staged DATASET... Irreversible'), refusal conditions ('Refuses while a running/queued job trains from it'), bounds ('≤ 2MB'), auth needs ('needs a logged-in Claude Code session'), and partial-failure behavior ('Per-file transient failures are reported without stopping the batch').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the bullet-per-action structure makes it scannable and each sentence adds new information (prerequisites, return values, safety warnings). It front-loads the core keying concept (name vs id). Slightly verbose, but the length is justified by the eight-action complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description must cover return values, side effects, ordering, and failure modes. It does: datasetPath, per-file warnings, caption returns, irreversibility, and auth failure behavior. The 100% schema coverage and eight-action enumeration leave no obvious gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds cross-parameter semantics: which action requires which params, how ref resolution works ('resolved against the connected ComfyUI's output/input dirs'), and the distinction between update/deleteImages and delete. It does not need to restate the schema but adds orchestration context that the schema alone lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Stage and curate the training DATASETS a LoRA run consumes — the images and their captions' and explicitly separates this from train_start ('the jobs that train on them live in the separate `train_start` tool and are keyed by `id`'). It enumerates eight distinct actions, making the verb+resource scoping unmistakable and distinguishing it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit sequencing ('Use after gathering images, before train_start (action:"start")'), alternative tools ('to delete a finished job's record and checkpoints use the separate train_start tool with action:"delete"'), and action-specific pairings ('Pair with action:"detail"'). Also includes practical guidance for when to use prepare (e.g., '10-30 varied images').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

train_startA

Run and inspect LoRA training JOBS — launch a run, poll it, stop it, delete it, and read back the settings behind it. Jobs are keyed by id; the datasets they train on live in the separate train_prepare_dataset tool and are keyed by name. Driven by the action parameter:

  • action:"start" — Start a LoRA training job: target 'local' builds the config and launches the GPU trainer container (docker run --gpus all); target 'pod' ssh-drives pod-native training on a connected RunPod pod (pod_id, or the connector's currently connected pod). Requires name + datasetPath. Returns a job id for action:"status"/action:"cancel". Long-running — returns immediately; poll action:"status". On completion the LoRA is delivered per deliverTo (pod/local/both) and cataloged when local. Run train_doctor first if unsure the image/docker/GPU (local) or bootstrap (pod) are ready.

  • action:"status" — Check training progress: pass an id for one job (step/total, loss, recent samples, log tail, result paths when done) or OMIT id for all jobs newest-first. Read-only.

  • action:"cancel" — STOP a RUNNING job (docker stop) by id and mark it cancelled. Nothing is erased: checkpoints already saved stay in the job's output dir; no LoRA is handed off to models/loras, so the run can be inspected afterwards. Returns ok:false when the container could not be confirmed stopped (the job reverts to running). This is the RECOVERABLE stop — use action:"delete" only when you also want the artifacts gone.

  • action:"delete" — DESTROY a finished job by id: its record AND its output dir with checkpoints/samples, unless keep_outputs is true. Irreversible — confirm with the user first. The delivered LoRA in models/loras is NOT removed. Running/queued jobs must be cancelled first (action:"cancel"). THIS DELETES A JOB, NOT A DATASET: to delete the staged images and captions a run consumed use the separate train_prepare_dataset tool with action:"delete", which is keyed by name rather than id.

  • action:"list_flows" — List the LoRA training flows and base models the local trainer supports (phase 1: character LoRA on FLUX.1-dev), with the default training params. Read-only, takes no other parameters — call this first to see what action:"start" accepts.

  • action:"job_config" — Show the effective settings a job ran with by id (steps/lr/rank/resolution/batch/saveEvery/sampleEvery/quantize), read back from the ai-toolkit config.yml it consumed, plus flow/model/trigger/datasetPath — everything needed to run the job again with tweaks. Read-only.

  • action:"preview_config" — Show the RAW ai-toolkit config.yml action:"start" WOULD write for these settings (the ostris-UI 'raw config' view) — no side effects, nothing is written or started. Requires name + datasetPath. Use it to review a run before launching; pass the same params to action:"start" to execute.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoTraining job id, as returned by action:"start" (e.g. "t8f3k2ab") — NEVER a dataset name. REQUIRED and must be non-empty for actions "cancel", "delete" and "job_config". OPTIONAL for action:"status": omit it (or pass an empty string) to list every job newest-first. Unused by "start", "list_flows" and "preview_config".
flowNoaction:"start" — training flow (see action:"list_flows").character
nameNoJob name — becomes the output .safetensors basename (e.g. 'aria_character'). REQUIRED for actions "start" and "preview_config". This names the RUN, not the dataset it reads.
modelNoaction:"start" — base model (see action:"list_flows").flux1-dev
actionYesWhich training-job operation to perform. "list_flows" takes no other parameters; "status" takes an OPTIONAL `id` (omit for all jobs); "cancel", "delete" and "job_config" require `id`; "start" and "preview_config" require `name` + `datasetPath`. NOTE "delete" here destroys a training JOB — deleting a staged DATASET is train_prepare_dataset action:"delete".
deviceNoaction:"start" — GPU selector, default cuda:0.
paramsNoTraining param overrides for actions "start" and "preview_config" (steps/lr/rank/resolution/batchSize/saveEvery/sampleEvery/quantize). Omitted keys fall back to the defaults from action:"list_flows". action:"preview_config" enforces the SAME bounds action:"start" does, so a preview always reflects a run that could actually launch.
pod_idNoaction:"start" — RunPod pod to train on (target 'pod'). Default: the connector's currently connected/watched pod.
targetNoaction:"start" — 'local' = docker on this rig; 'pod' = pod-native over ssh on a RunPod pod.local
triggerNoUnique trigger word (e.g. 'ohwx person') — injected as trigger_word and usable in prompts.
deliverToNoaction:"start", pod jobs only: where the finished LoRA lands.both
model_pathNoaction:"start" — override the base model path AS THE TRAINER SEES IT (pod path for target 'pod', container path for 'local') — e.g. a pre-uploaded local HF snapshot dir when the default HF repo id is gated/unreachable.
datasetPathNoDataset dir from train_prepare_dataset (images + same-basename .txt captions). REQUIRED for actions "start" and "preview_config".
keep_outputsNoaction:"delete" — keep the job's output dir (checkpoints/samples) and delete only the record.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: launching docker containers, ssh-driven pod training, long-running behavior with polling, docker stop for cancel, irreversibility of delete, and no-side-effect guarantees for preview_config. It also documents what happens on completion (delivery per deliverTo, cataloging when local) and recovery behavior if cancel fails.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but perfectly structured with a front-loaded summary followed by action-based bullets. Each sentence earns its place, covering all seven actions, required parameters, side effects, and safety warnings. The organization makes the density manageable and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex 14-parameter tool with six actions, nested params, and no output schema or annotations. The description addresses all operational aspects: prerequisites, side effects, safety, read-only actions, and next steps after completion. It even covers edge cases like cancel reverting to running and delete requiring cancellation first. The coverage is comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds significant meaning beyond the schema: it specifies which parameters each action requires, clarifies that `name` names the run not the dataset, gives examples for id and trigger, and explains parameter fallback behavior. It also notes that preview_config enforces the same bounds as start, adding practical semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific statement: 'Run and inspect LoRA training JOBS — launch a run, poll it, stop it, delete it, and read back the settings behind it.' It also explicitly distinguishes from the sibling train_prepare_dataset tool by noting jobs are keyed by `id` while datasets are keyed by `name`. This is a specific verb+resource combination that fully disambiguates the tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance per action, including when to omit `id` for status, when to use `cancel` vs `delete`, and when to call `list_flows` first. It names alternatives like train_prepare_dataset for dataset deletion and train_doctor for readiness checks, providing clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_imageA

Put a file where ComfyUI (or cloud storage) can read it. Driven by the action parameter:

  • action:"image" — Upload a local image file to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint so it can be referenced in LoadImage nodes. Works for both local and remote ComfyUI. Returns the stored filename.

  • action:"video" — Upload a local video file (.mp4, .mov, .webm, .avi, .mkv, .m4v) to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint for use in video-loading nodes such as VHS_LoadVideo (ComfyUI-VideoHelperSuite). Works for both local and remote ComfyUI. Returns the stored filename.

  • action:"audio" — Upload a local audio file (.wav, .mp3, .flac, .ogg, .m4a, .aac) to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint for use in audio-conditioned workflows (e.g. LoadAudio). Works for both local and remote ComfyUI. Returns the stored filename.

  • action:"stage" — Stage an EXISTING ComfyUI output (or temp/preview) as an INPUT so the next stage's loader (LoadImage / VHS_LoadVideo / LoadAudio) can read it. This is the CORRECT way to chain a multi-stage pipeline (e.g. Krea2 image → LTX video → WAN extend): it fetches the output's bytes from the server via /view and re-registers them as an input via /upload/image — the same endpoints get_image and the uploads above use. Because it goes entirely through the server API, it works even when ComfyUI was launched with a CUSTOM input/output directory. Do NOT instead copy the output file or guess a filesystem input/ path — the server's input dir may be custom and it will reject the file ("Invalid image file"), wasting the render. Pass an existing output reference ({ filename, subfolder?, type? }); the media kind (image/video/audio) is inferred from the extension unless you set kind. Returns the registered input { filename, subfolder, type: "input", kind } — drop the returned filename straight into the loader's image/video/audio widget.

  • action:"output" — Upload a generated ComfyUI output to CLOUD storage (this is the only action that sends bytes off the machine). Source can be asset_id or a local path under COMFYUI_PATH/output. Destination can be S3, Azure Blob, HTTP PUT, or HuggingFace via the hf CLI.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoaction:"stage" — force the media kind instead of inferring it from the file extension.
pathNoaction:"output" — path to a generated output under COMFYUI_PATH/output. Provide exactly one of asset_id or path.
typeNoaction:"stage" — source directory the asset lives in: output (default) or temp (previews).
actionYesWhat to upload and where. "image"/"video"/"audio" send a LOCAL file (`source_path`) to ComfyUI's input/ directory; "stage" re-registers an EXISTING server-side output (`filename`) as an input; "output" ships a generated output to cloud storage (`destination`).
asset_idNoaction:"output" — registered asset id from a completed job. Provide exactly one of asset_id or path.
filenameNoTwo meanings, one per action. actions "image"/"video"/"audio" — OPTIONAL override for the filename in ComfyUI's input/ directory (auto-detected from source_path if omitted). A path prefix (e.g. assets/clip.mp4) places the upload in that SUBFOLDER of input/ — ".." is refused — and the returned filename reference includes the subfolder, since loaders need the qualified path. action:"stage" — REQUIRED filename of the EXISTING output/temp asset to re-register (from get_history or get_image action:"list_outputs"), e.g. LTX_video_00001.mp4; its destination name override is `as_filename`, not this field.
subfolderNoaction:"stage" — subfolder the source asset currently lives in, if any.
as_filenameNoaction:"stage" — override the filename it is registered under in the input/ directory (defaults to the source filename).
destinationNoaction:"output" — REQUIRED. Exactly one upload destination.
source_pathNoAbsolute path to the local file to upload. REQUIRED for actions "image", "video" and "audio".

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and delivers: it discloses the HTTP endpoints used, behavior for local and remote ComfyUI, handling of custom input/output directories, return values, and the important fact that only the 'output' action sends bytes off the machine. It also surfaces edge-case behavior like '..' being refused in filename paths.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded summary and action-based bullets, which is appropriate for a complex tool with five modes. However, phrases like 'Works for both local and remote ComfyUI' and 'via the HTTP /upload/image endpoint' are repeated three times each, adding unnecessary redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's high complexity (10 parameters, nested destination objects, multiple action modes) and no output schema, the description is remarkably complete. It covers all actions, parameter interactions, return values, edge cases, and even notes an API compatibility quirk ('async' accepted but uploads complete before returning).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds substantial parameter semantics beyond the schema: it explains the dual meaning of 'filename' across actions, subfolder qualification for loaders, the 'as_filename' override for staging, and the exact relationship between 'action', 'source_path', 'asset_id', and 'destination'. The examples and warnings make parameter behavior significantly clearer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as an upload utility for ComfyUI and cloud storage, using a specific verb ('Put a file') and a concrete resource. It differentiates the five action modes (image/video/audio/stage/output) with enough specificity to distinguish them from each other and from sibling tools like get_image.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance for each action, including the 'stage' action as the correct way to chain multi-stage pipelines. It also gives a clear exclusion: 'Do NOT instead copy the output file or guess a filesystem input/ path' because custom input directories will reject the file. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

visualize_workflowA

DRAW a diagram of, or convert, workflow JSON you PASS IN (a JSON string or object) — it does NOT read the user's live canvas, so for 'show me what's on the canvas' / the CURRENTLY-OPEN graph use panel_graph_outline instead. Driven by the action parameter:

  • action:"render" — Mermaid flowchart of the whole graph: nodes grouped by category, connections labeled by data type.

  • action:"render_hierarchical" — the same graph SECTIONED rather than flat, which is what you want past ~20 nodes. view picks a compact overview, one section in detail, a text listing, or an AI-oriented structured summary.

  • action:"mermaid" — the INVERSE of render: a Mermaid flowchart back into executable API-format workflow JSON, wired from /object_info schemas.

  • action:"to_dsl" — API-format JSON into the compact, human/LLM-readable authoring DSL: key <- nodeId.outputIndex for connections, key = <JSON> for literals. Round-trips losslessly. (Experimental.)

  • action:"from_dsl" — that DSL back into executable JSON, plus advisory wiring warnings when ComfyUI is reachable (the conversion succeeds either way). (Experimental.)

ParametersJSON Schema
NameRequiredDescriptionDefault
dslNoaction:"from_dsl" (REQUIRED) — Workflow DSL text
viewNoaction:"render_hierarchical" — overview: compact diagram with sections as summary nodes; detail: full diagram for one section; list: text summary of all sections; summary: structured text optimized for AI ingestion with node IDs, key settings, virtual wires, and full connection graphoverview
actionYesWhich rendering/conversion to perform. "render", "render_hierarchical" and "to_dsl" require `workflow`; "mermaid" requires `mermaid`; "from_dsl" requires `dsl`.
mermaidNoaction:"mermaid" (REQUIRED) — Mermaid flowchart text (with or without ```mermaid code fence). Nodes should use ComfyUI class_type names as labels. Connections should be labeled with data types (e.g., -->|MODEL|).
sectionNoaction:"render_hierarchical" — Section name to show in detail view (required when view=detail). Use view=list to see available section names.
workflowNoComfyUI workflow JSON (as a JSON string or object; API or UI format is auto-detected). REQUIRED for action:"render", action:"render_hierarchical" and action:"to_dsl" — "to_dsl" expects API format (node ID -> {class_type, inputs}).
directionNoaction:"render" / action:"render_hierarchical" — Flowchart direction: LR (left-to-right) or TB (top-to-bottom). Default LR for "render" and for the hierarchical detail view, TB for the hierarchical overview.
show_valuesNoaction:"render" / action:"render_hierarchical" — Include widget values (seed, steps, cfg, etc.) in node labels (detail view only, for the hierarchical action).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It discloses that the tool does not read the live canvas, that conversions round-trip losslessly, that from_dsl emits advisory warnings only when ComfyUI is reachable, and marks experimental actions. It doesn't explicitly state side-effect safety (e.g., read-only), but the nature of the actions and these caveats offer good behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but extremely well-structured, front-loading the core purpose and the key limitation before a bullet list of actions. Each action is described in one compact sentence with prerequisites and output types. No filler or repetition; all sentences earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, 5 actions, no annotations, and no output schema, the description compensates thoroughly. It covers every action's purpose, requirements, and output format, plus edge cases like auto-detection of API/UI format and lossless round-tripping. The absence of an output schema is mitigated by explicit descriptions of each action's result (diagram, text listing, structured summary, DSL).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a detailed description. The tool description adds value by tying parameters to actions, e.g., 'to_dsl expects API format (node ID -> {class_type, inputs})' and clarifying which action requires which parameter. This goes beyond the schema's per-field descriptions, providing cross-parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'DRAW a diagram of, or convert, workflow JSON you PASS IN.' It immediately distinguishes from siblings by noting it does NOT read the live canvas and directs to panel_graph_outline for that case. The action list further clarifies each mode (render, render_hierarchical, mermaid, to_dsl, from_dsl), making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use an alternative: for 'show me what's on the canvas' use panel_graph_outline. It also gives action-specific guidance, e.g., render_hierarchical is what you want past ~20 nodes, and to_dsl/from_dsl are experimental. This provides clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

workspaceA

Inspect and manage ComfyUI workspaces (local installs). Driven by the action parameter:

  • action:"get" — Report the active ComfyUI workspace (mirrors comfy-cli which): the local installation path being used (from COMFYUI_PATH or auto-detection), the source of that path, any persisted default workspace, and the resolved API target the MCP server talks to.

  • action:"set_default" — Persist a default ComfyUI workspace path to the MCP config file (mirrors comfy-cli set-default). The value is stored under the OS config dir (e.g. ~/.config/comfyui-mcp/workspace.json) and reported by action:"get"/action:"list". Does NOT change the live API target. path is REQUIRED, e.g. {action:"set_default", path:"/opt/ComfyUI"}.

  • action:"list" — List known/auto-detected ComfyUI installations on this machine. Scans common install locations across macOS, Linux, and Windows and marks which one is active and which is the saved default.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoaction:"set_default" — REQUIRED absolute path to a ComfyUI installation directory to remember as the default workspace.
actionYesWhich workspace operation to perform. "get" and "list" take no other parameters; "set_default" requires `path`.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It reveals key behavioral traits: set_default does NOT change the live API target, it stores the value in a config file under the OS config dir, and list scans common install locations across macOS, Linux, and Windows. It doesn't mention overwrite semantics or permissions, but covers substantial behavioral ground.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a summary line followed by a bullet list of actions. Each sentence conveys important information without redundancy. It is slightly longer than minimal, but every part contributes to understanding the tool's behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly covers the behavior of each action: what get reports, what set_default persists, and what list scans. Since there is no output schema, the description appropriately explains the essential return/effect semantics. Missing only minor details like exact output format or error handling, which are not critical given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, giving a baseline of 3. The description adds meaningful value by explaining each action's semantics in detail (e.g., get mirrors comfy-cli which), clarifying that path is required for set_default, and providing an example usage. This exceeds the baseline with concrete guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Inspect and manage ComfyUI workspaces (local installs)', which clearly states a specific verb and resource. It distinguishes itself from siblings like comfy_cli, install_comfyui, and runpod by focusing on local installation path management. The three actions (get, set_default, list) further clarify its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear per-action context: get reports the active workspace, set_default persists a default, and list scans local installs. It does not explicitly name alternatives or exclusion criteria, but the 'local installs' qualifier implicitly disambiguates from remote/runpod tools. Clear context with no explicit exclusions warrants a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A3.9/5.0
Disambiguation4/5

Most tools have clearly distinct purposes, but the large number creates some overlap risk—e.g., install_comfyui's update_all vs install_custom_node's update, or generate_image vs enqueue_workflow for starting renders. The detailed descriptions help differentiate, but an agent must read them carefully.

Naming Consistency3/5

The majority follow verb_noun (save_workflow, get_image), but many deviate: noun-only tools (queue, runpod, apps), noun_noun compounds (node_pack, model_metadata), and awkward structures (train_start, train_prepare_dataset). This mix makes the naming somewhat predictable but not uniform.

Tool Count2/5

With 40 tools, this server is well beyond the 25+ threshold considered 'too many'. While the broad scope (workflows, generation, models, training, runpod) justifies some complexity, the count is excessive and would be better split into focused servers or consolidated.

Completeness5/5

The tool surface is exceptionally complete, covering CRUD for workflows, models, custom nodes, training datasets/jobs, and runpod management. There are few obvious gaps for the stated purpose, and the server even includes utilities like calculate and batching.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/artokun/comfyui-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server