MCP server for ComfyUI — text-to-image generation via the Model Context Protocol.
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 10 tools have detailed descriptions (avg 250+ chars) explaining WHAT, WHEN, and side effects. Input schemas are complete with type definitions and parameter descriptions. However, output schemas are not formally documented in the tool registration, responses are described in text but not as structured JSON Schema. Error handling guidance is present in descriptions but not systematized. Tool naming follows verb_noun pattern consistently. No security issues detected (no secrets in params). Composition is sound: tools chain well (e.g., list_models feeds into generate_image). Main gap: output schema documentation and per-tool error classification.
Generates an image from a text prompt using this server's built-in SDXL text-to-image (txt2img) workflow: it enqueues a job on the configured ComfyUI instance and polls /history until the job completes (timeout 10 minutes). Side effects: enqueues a ComfyUI job and writes output PNG file(s) on the ComfyUI host; not idempotent (a random seed is used unless you pass one), requires no auth. Returns a text block listing the generated image URL(s) of the form <comfyui-public-url>/view?filename=... plus the ComfyUI prompt_id. Use this for standard single text-to-image generation; use generate_variations for several seed-varied results at once, generate_with_workflow or run_workflow_template to run a custom node graph, refine_image for img2img on an existing image, and the conditioning tools for ControlNet/IP-Adapter guidance.
Generates several images from one prompt by running the txt2img workflow `count` times with consecutive seeds (base_seed, base_seed+1, ...), submitting the jobs to ComfyUI in parallel and waiting for all to finish. Side effects: enqueues `count` ComfyUI jobs and writes `count` PNG file(s) on the ComfyUI host; not idempotent unless you pin base_seed; no auth. Returns a text block listing all generated image URL(s) (<comfyui-public-url>/view?...) and the starting seed. Use this to explore a concept or pick the best of several takes; use generate_image for a single image, or refine_image/the conditioning tools when you need img2img or guided control.
Generates an image whose composition is constrained by a ControlNet conditioning map (pose, depth, canny edges, normal map, etc.) plus a text prompt. It fetches control_image_url, uploads it to ComfyUI, builds a ControlNet workflow, submits it, and polls /history until done (timeout 10 minutes). Requirements/side effects: the named ControlNet model must already be installed in ComfyUI's models/controlnet/; the control image must already be preprocessed (this tool runs NO preprocessors); enqueues a job and writes an output PNG on the ComfyUI host; not idempotent unless seed is pinned; no auth. Returns a text block with the generated image URL(s) (<comfyui-public-url>/view?...), the ControlNet model name, and the prompt_id. Use this when you need structural control over layout; use generate_with_ip_adapter for style/subject transfer instead of structure, refine_image for plain img2img, or generate_image for unconstrained text-to-image.
Output schemas not formally documented in tool registration. Descriptions state what is returned (e.g., 'text block listing generated image URL(s)') but no structured JSON Schema for response fields. LLMs cannot reliably extract fields from unstructured text responses.
Error handling lacks systematic classification. Descriptions mention error conditions (e.g., 'invalid graphs raise node_errors') but do not categorize as retryable, user-fixable, or fatal. No recovery guidance for common failures (e.g., 'if checkpoint not found, call list_models to discover valid names').
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | <=2025-11-25 | v2 |
Generates an image that borrows the visual style/subject of a reference image via IP-Adapter, combined with a text prompt. It fetches reference_image_url, uploads it to ComfyUI, builds an IP-Adapter workflow with the chosen preset, submits it, and polls /history until done (timeout 10 minutes). Requirements/side effects: needs the ComfyUI-IPAdapter-plus custom node pack plus the preset's matching IPAdapter and CLIP-Vision models installed (missing ones cause a ComfyUI node error); enqueues a job and writes an output PNG on the ComfyUI host; not idempotent unless seed is pinned; no auth. Returns a text block with the generated image URL(s) (<comfyui-public-url>/view?...), the preset, the weight, and the prompt_id. Use this for style/identity transfer from a reference; use generate_with_controlnet when you instead need to lock in pose/structure, or generate_image for plain text-to-image.
Submits an arbitrary, caller-supplied ComfyUI workflow graph as-is, then polls /history until it completes (timeout 10 minutes). This is the escape hatch for any pipeline the built-in tools do not cover (custom samplers, LoRAs, multi-stage graphs, etc.). Side effects: enqueues whatever the workflow does on the ComfyUI host (may write files, load models); behavior and idempotency depend entirely on the submitted graph; no auth. The workflow must contain a SaveImage node or nothing will be returned; invalid graphs raise the node_errors reported by ComfyUI. Returns a text block listing produced image URL(s) (<comfyui-public-url>/view?...) and the prompt_id. Use this for one-off custom graphs; use save_workflow_template + run_workflow_template to persist and re-run a graph by name, and the higher-level tools (generate_image, refine_image, upscale_image, generate_with_controlnet, generate_with_ip_adapter) when they fit.
Lists the names of one category of resource installed on the connected ComfyUI instance (checkpoints, loras, samplers, schedulers, or upscalers) by querying ComfyUI's /object_info endpoint. Read-only; no side effects, no auth. Returns a text block with the category name, the count, and a numbered list of names (or '(none found)'). Use this first to discover valid values for the 'checkpoint' parameter of the generate/refine/conditioning tools and the 'upscale_model' parameter of upscale_image; use list_workflows to see the built-in workflow templates instead of models.
Lists the built-in workflow names shipped with this MCP server (txt2img, img2img, upscale, controlnet, ip_adapter). Read-only; reads a static in-code list, does not contact ComfyUI, no side effects, no auth. Returns a text block with the count and a numbered list of the built-in workflow names. These name the pipelines exposed by the dedicated tools (generate_image, refine_image, upscale_image, generate_with_controlnet, generate_with_ip_adapter); for an arbitrary custom graph use generate_with_workflow, and for saved user templates use list_workflow_templates.
Transforms an existing image with prompt-guided img2img: it fetches source_image_url, uploads it to ComfyUI, encodes it to a latent, and runs a denoising pass driven by the prompt (denoise controls how far it strays from the original), polling /history until done (timeout 10 minutes). Side effects: enqueues a job and writes an output PNG on the ComfyUI host; not idempotent unless seed is pinned; no auth. Returns a text block with the refined image URL(s) (<comfyui-public-url>/view?...), the denoise value, the uploaded source filename, and the prompt_id. Use this to edit/reinterpret an existing image (style changes, fixes, variations on a base); use upscale_image for a pure resolution boost with no content change, generate_image for a fresh image from scratch, or the conditioning tools for structural/reference-guided control.
Uploads an image into ComfyUI's input store so it can be referenced by name in later workflows (LoadImage nodes for img2img, ControlNet, IP-Adapter, etc.). Source is either source_url (fetched over HTTP) or raw image_base64 (provide exactly one; missing both throws). Side effects: writes a file into ComfyUI's input directory on the ComfyUI host; no generation is run; no auth. Returns a text confirmation with the stored filename, its subfolder, and its type. Use this when you want to pre-stage an image for generate_with_workflow / run_workflow_template; note the higher-level tools (refine_image, upscale_image, generate_with_controlnet, generate_with_ip_adapter) already fetch-and-upload their input URLs for you, so you usually do not need to call this first.
Upscales an image using a real-esrgan or similar upscale model: it fetches source_image_url, uploads it to ComfyUI, runs the upscale workflow, and polls /history until done (timeout 10 minutes). Side effects: enqueues a job and writes an output PNG on the ComfyUI host; not idempotent; no auth. Returns a text block with the upscaled image URL(s) (<comfyui-public-url>/view?...), the upscale model name, and the prompt_id. Use this for pure resolution increase with no content change; use refine_image if you want to also alter the image with a prompt, or generate_image for a fresh image.
Numeric parameters lack explicit min/max constraints in schema. E.g., 'steps' is described as '1-150' in text but JSON Schema type is 'number' without minimum/maximum properties. LLMs may pass out-of-range values; validation happens server-side, not client-side.
Enum constraints not formalized in schema. E.g., 'kind' parameter in list_models is described as 'One of: checkpoints, loras, samplers, schedulers, upscalers' but schema type is 'string' without enum array. LLMs may hallucinate invalid values.
Non-idempotent operations (generate_image, generate_variations, refine_image, upscale_image) lack confirmation or dry-run support. Descriptions note 'not idempotent' but no pattern to prevent accidental duplicate submissions on retry.