MCP server for Claude Code that attaches to a running ComfyUI Desktop backend and exposes tools for discovering nodes/models, running workflows, tracking jobs, and inspecting outputs.
Server has 15 tools with complete input schemas and descriptions. Naming follows verb_noun convention (comfy_status, list_models, run_workflow). Descriptions are present and contextual (avg ~120 chars), exceeding the 10-char minimum but below the 50-200 char LLM-optimized range for several tools. All parameters have type definitions and descriptions. However, output schemas are not documented, LLMs cannot predict return structure. Error handling is minimal (generic _err() helper). No tool annotations (readOnlyHint/destructiveHint). Parameter constraints lack enums where applicable (e.g., folder in list_models accepts free-form strings instead of an enum of valid folders). No confirmation pattern for destructive ops (run_workflow, cancel_job, free_vram). Composition is sound, tools chain well (search_nodes → get_node_schema → run_workflow). Security: no secrets in params (good), but no audit logging visible.
Cancel a queued or running job. Args: prompt_id: job ID. force: if true, cancel even if not submitted by this server (use sparingly).
Cancel a job running on Comfy Cloud.
Check the status of a job running on Comfy Cloud.
Check ComfyUI connectivity, version, GPU/VRAM, and queue state. Call this first in a session to confirm the server is reachable.
Free GPU memory (unload models). Args: unload_models: if true, unload all models; if false, just clear cache.
Fetch details of a specific job (status, outputs, errors).
Fetch the full schema for a node class (inputs, outputs, defaults, constraints).
Output schemas not documented. LLMs cannot predict return structure (e.g., what fields does comfy_status return? what does run_workflow return on success vs. error?). Forces LLMs to guess or make assumptions.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Clients cannot distinguish safe reads from destructive writes. run_workflow, cancel_job, free_vram, upload_image should be marked destructive; comfy_status, list_*, get_* should be marked read-only.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
Download a job output file (image, video, etc.) as base64.
Fetch a template's structure and parameter schema.
List recent jobs (running, pending, or completed). Args: mine_only: if true, show only jobs submitted by this server. limit: max results (default 50).
List model folders, or the models inside one folder. Args: folder: empty for the folder list; or e.g. "checkpoints", "loras", "vae", "controlnet", "upscale_models".
List available workflow templates.
Run a workflow (template or raw) and wait for completion. Args: workflow: raw workflow dict (UI or API format), or None if using a template. template: template name (e.g. "flux_txt2img"), or None if using a raw workflow. params: dict of overrides; for raw workflows, keys are "node_id.input_name". wait_timeout_s: max seconds to wait for completion (default 600). cloud: if true, run on Comfy Cloud (requires API key); if false, run locally.
Search installed node types by name/category (from /object_info). Args: query: case-insensitive substring, e.g. "ltx", "save video", "upscale". limit: max results.
Upload an image (base64 or URL) to the input folder for use in workflows.
Parameter 'folder' in list_models accepts free-form strings instead of an enum. Should constrain to: checkpoints, loras, vae, controlnet, upscale_models, etc. LLMs will hallucinate invalid folder names.
Destructive operations (run_workflow, cancel_job, free_vram) lack confirmation or dry-run patterns. Agents can accidentally trigger expensive GPU operations or cancel critical jobs without safeguards.
Error handling is minimal. Generic _err() helper returns {error: message} with no guidance on recovery, retryability, or next steps. E.g., if run_workflow fails due to invalid node, LLM has no hint to call search_nodes or get_node_schema.