comfy-mcp
Comfy-mcp is an MCP server that turns a self-hosted ComfyUI into private, one-shot media generation for AI hosts like Claude Code or Codex.
Generate images from text prompts (
generate_image) with model, size, aspect, seed, steps, cfg, count, and save options.Edit or compose images from 1–4 references (
edit_image), with the first image defining the base/canvas.Generate videos with sound (
generate_video) in modes: text-to-video, first/last frame, 1–3 references, and references + audio; supports drafts, seeds, steps, and async job handling.Check server status: ComfyUI reachability, version, GPU memory, queue length, and whether foreign jobs are running.
List available models and their readiness, plus everything ComfyUI has installed (
list_models).Manage long renders asynchronously:
job_status,wait_for_job,fetch_result, andcancel_job.Return results as saved files, base64, or authenticated download handles; previews are included for image-capable clients.
Keep media private: outputs stream over websocket, temp files are blanked, history entries are deleted, and no logs/cache are kept.
Configure via TOML/env vars: server URL, output directory, preview size, timeouts, save policy, default model, and per-model file paths.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@comfy-mcpGenerate a photorealistic picture of a cat wearing a space suit."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
comfy-mcp
An MCP server that turns a self-hosted ComfyUI into one-shot, private media generation for any MCP host. Ask Claude Code, Codex or any other MCP client for an image and get back a preview plus a full-size file on your own machine, with nothing left behind on the server.
Plain parameters, no node graphs:
generate_image,edit_image(one reference or 2–4 references composed),generate_video(text, first/last frame, references, references + audio),server_status,list_models, job tools for long renders.Model-agnostic tool surface: every generation tool takes a
modelkey, and each model is a small self-contained recipe with its own config section. Bundled: Qwen Image 2.1 (qwen21) for images and MiniMax H3 (minimax_h3) for video with sound. Music is next (see roadmap).Private by construction: images stream back over the websocket and are never written to the ComfyUI server's disk; video goes through ComfyUI's throwaway temp folder and is blanked the moment it has been fetched; reference images and audio use the same temp folder; the prompt's history entry is deleted as soon as the result arrives; this server keeps no logs, cache or transcripts.
Always queues politely behind other ComfyUI jobs and reports its position.
stdio transport for CLI hosts; optional Streamable HTTP with a bearer token for browser chat UIs.
Developed against a DGX Spark; works with any ComfyUI ≥ 0.36 that has the files for at least one bundled model installed.
Requirements
ComfyUI 0.36+ reachable over HTTP, with the model files for at least one bundled model. For
qwen21that is a Qwen Image 2.1 diffusion model, its Qwen3-VL text encoder and the 2.1 VAE; the defaults expect Comfy-Org's INT8 names (qwen_image_2.1_int8_convrot,qwen3vl_8b_int8_convrot,qwen_image_2.1_vae_bf16), and other precisions or renamed files go in the[qwen21]config section.list_modelstells you what is ready.For video: the MiniMax H3 files (
[minimax_h3]section: the fl2va and ref2va diffusion models, the Qwen3-VL 32B encoder, the video and audio VAEs and the turbo LoRA) plus the ComfyUI-VideoHelperSuite custom node pack, whose Video Combine node is the only built-in-or-common node that can write a video to ComfyUI's temp folder instead of its output folder. The bundledSaveImageWebsocketcustom node (ships with ComfyUI incustom_nodes/websocket_image_save.py) must be enabled.uv on the client machine. Python 3.12+ is fetched automatically.
Related MCP server: ComfyUI MCP Server
Install
uv tool install git+https://github.com/mike-nott/comfy-mcp
comfy-mcp init # writes ~/.config/comfy-mcp/config.toml — set comfyui_url to your server
comfy-mcp check # prints resolved settings and the ComfyUI statusOr run it ad hoc without installing: uvx --from git+https://github.com/mike-nott/comfy-mcp comfy-mcp.
Upgrade with uv tool upgrade comfy-mcp. Every release bumps the version, which is what makes that command fetch the new code.
Configure
~/.config/comfy-mcp/config.toml (or --config PATH, or $COMFY_MCP_CONFIG). Every key is optional:
comfyui_url = "http://127.0.0.1:8188" # your ComfyUI; env: COMFYUI_URL
output_dir = "~/Pictures/ComfyUI" # env: COMFY_MCP_OUTPUT_DIR
preview_px = 512 # long edge of the inline preview
max_wait = 120 # seconds a call blocks before handing back a job id
default_steps = 25
default_cfg = 1.0
max_pixels = 2097152 # 2 MP canvas cap
job_ttl = 1800 # seconds unfetched results stay in memory
save_policy = "default" # "default" | "never" | "always"; env: COMFY_MCP_SAVE_POLICY
default_image_model = "qwen21" # used when a call omits `model`
free_models_after = ["video"] # unload ComfyUI's models after these job kinds; images stay warm
# The full set of keys, including [minimax_h3] video files and [minimax_h3.accel], is in config.example.toml.
[qwen21] # the three files as ComfyUI lists them; defaults are Comfy-Org's INT8 names
diffusion_model = "qwen_image_2.1_int8_convrot.safetensors"
text_encoder = "qwen3vl_8b_int8_convrot.safetensors"
vae = "qwen_image_2.1_vae_bf16.safetensors"
[http] # only for `comfy-mcp --http`
host = "127.0.0.1"
port = 8765
token = "" # required, ≥16 chars; env: COMFY_MCP_HTTP_TOKENAdd to a host
Claude Code
claude mcp add --scope user comfy-mcp -- comfy-mcp
# or without installing:
claude mcp add --scope user comfy-mcp -- uvx --from git+https://github.com/mike-nott/comfy-mcp comfy-mcpCodex — ~/.codex/config.toml:
[mcp_servers.comfy-mcp]
command = "comfy-mcp"Any stdio host (OMP, Cursor, LM Studio, …) — the generic JSON shape:
{ "mcpServers": { "comfy-mcp": { "command": "comfy-mcp", "args": [] } } }Streamable HTTP clients (browser chat UIs such as vllm-chat) — run the server once, on the ComfyUI box or your workstation:
COMFY_MCP_HTTP_TOKEN=$(openssl rand -hex 24) comfy-mcp --http # or set [http] token in the configthen point the client at http://<host>:8765/mcp with Authorization: Bearer <token>. Bind [http] host = "0.0.0.0" to serve the LAN.
Delivering full-size files to a remote user. When comfy-mcp runs on a server for a browser chat UI, output_dir is on the wrong machine. Set save_policy = "never" on that instance: nothing is ever written to disk, whatever save the model passes, and each full-size file is returned as a line of its own:
download: comfy://result/<handle>.pngThe client's backend fetches it with the same bearer token as /mcp:
GET http://<host>:8765/dl/<handle>.png
Authorization: Bearer <token>The response streams from memory with the right Content-Type, Content-Disposition: attachment; filename="<timestamp>-<seed>.<ext>" and Cache-Control: no-store. A handle stays fetchable until 60 s after its first complete download (a retry window) or until job_ttl, whichever comes first; HEAD and aborted transfers do not use it up. Fetching the same job again (fetch_result after wait_for_job) returns the same handle, or a note that the file was already downloaded, plus the preview. The client should strip download: lines before passing tool results to the model. In HTTP mode save=false under the default policy also returns handles instead of base64.
Models
Key | Model | Tools | Status |
| Qwen Image 2.1 |
| bundled |
| MiniMax H3 video (with sound) |
| bundled; needs VideoHelperSuite |
— | MiniMax Music 3 |
| planned |
— | Krea2, Ideogram 4, FLUX.2 Klein |
| candidates |
Adding a model is a recipe module plus a config section; see ARCHITECTURE.md.
Speed (MiniMax H3)
Video is compute-bound in the sampler, so the levers are the attention kernel, cross-step caching and how much you render. The [minimax_h3.accel] config section controls what comfy-mcp adds to the graph, in the order the packs require (Sage → Sol-Attn → fused modulation → chunked feed-forward → Spectrum or FirstBlockCache, with the patched model feeding both scheduler and guider):
first_block_cache(default on, finals only): needs the FirstBlockCache pack; settings default to the 20-step-safe values.sol_attn(default on): sparse attention via the Sol-Attn pack's H3 patch, run in strict mode so a fallback fails loudly instead of silently rendering dense.sage_patch(default on): node-scoped SageAttention through KJNodes, applied before Sol-Attn. Leave ComfyUI's global--use-sage-attentionflag off with H3.fused_modulationandchunk_feed_forward(default off): kernel-fusion nodes from the Sol-Attn pack; the modulation patch is incompatible with ComfyUI 0.36's H3 block.spectrum(default off): step forecasting as an alternative to FirstBlockCache; the two must not be combined.Drafts render at
draft_width×draft_heightand are upscaled with a small SPAN model (upscale_modelinmodels/upscale_models) back to the final canvas; caching is not applied to drafts because turbo schedules have little to reuse.stepsongenerate_videooverrides the step count;final_steps/draft_stepsset the defaults.
Node class names (fbc_node, sol_node, …) are overridable, and any option a node does not declare is dropped with a note in the result rather than failing the render. list_models reports which acceleration nodes are present.
Measured on a DGX Spark (5 s clip, 1280×704, ComfyUI 0.36, INT8 ConvRot files, seeds varied): plain attention 887 s; FirstBlockCache 683 s; plus Sol-Attn 496 s; plus the Sage patch 479 s. The draft profile with Sol-Attn renders in 197 s.
Host timeouts
An image render takes 20–60 s, longer when the GPU is shared. Video is much slower (on a DGX Spark sharing memory with a 27B LLM, a 5 s MiniMax H3 clip takes about 3.3 minutes as a draft and 8 minutes at the final 20 steps with the default acceleration, against 6 and 15 minutes without it) which is why generate_video never blocks: it returns a job_id and wait_for_job does the waiting in chunks of whatever your host allows. For images, every MCP host applies its own timeout to a tool call, and if that is shorter than the render the host reports an unknown outcome even though the job completes and the file is saved. Two ways to avoid it:
Raise the host's timeout so calls finish inline. OMP: add
"timeout": 180000(milliseconds) to the server entry inmcp.json. Claude Code and Codex have their own settings for MCP tool timeouts; see their documentation.Or lower comfy-mcp's wait below the host's timeout, per host, with
COMFY_MCP_MAX_WAITin the server entry'senv. The call then returns ajob_idin time and the model finishes withwait_for_job.
Either way nothing is lost: a job that was already delivered to a caller that gave up can be fetched again with fetch_result, and server_status lists active jobs.
Tools
Tool | What it does |
| Text to image. |
| Edit one image or compose from 2–4. |
| 5–15 s clip with sound. |
| Version, GPU memory, queue counts, whether a foreign job is running, our active jobs. |
| The |
| Used when a call outlasts |
Every result carries a text part (saved paths, seed, size, timing) so text-only clients work, followed by a JPEG preview (each image, or the first frame of a video) for clients that render images. Pass save=false to get the full file as base64 in the text and write nothing.
The image_prompt_guidance and video_prompt_guidance prompts (optionally per model) and the comfyui://models resource are also exposed.
See ARCHITECTURE.md for how a call flows through ComfyUI.
Privacy notes
What this server does:
Output images travel over the websocket (
SaveImageWebsocket); noSaveImage, nothing in ComfyUI'soutput/.After a video job (configurable with
free_models_after) the server asks ComfyUI to unload its models, so the multi-GB video encoder and model do not stay resident on a box shared with other services. Image models stay warm for fast iteration.Video is written by VideoHelperSuite to ComfyUI's
temp/folder (neveroutput/), fetched once, then every file it left (the MP4, the video-only intermediate and the first-frame PNG) is overwritten with a 1×1 blank. The first-frame preview comes over the websocket like an image. Video metadata embedding is off, so the prompt is not stored in the file.Reference images are uploaded with
type=tempunder random names and referenced asname [temp]. Nothing goes toinput/. As soon as the job finishes, each temp file is overwritten with a 1×1 blank PNG (ComfyUI has no delete endpoint); the empty files vanish when ComfyUI restarts.With
save_policy = "never", full-size results are never written to disk on the machine running comfy-mcp: they are held in memory and handed out once as authenticated download handles (see Delivering full-size files to a remote user), then dropped.POST /history {"delete": [prompt_id]}runs as soon as the prompt finishes, success or failure.No log file, no cache, no persisted job list.
--debugprints terse diagnostics to stderr only.
What it cannot control: ComfyUI's own console log records that a prompt ran and how long it took (not its text). Live sampler previews are sent to this client only and discarded.
Development
uv sync
uv run pytest # unit tests, no ComfyUI needed
COMFY_MCP_LIVE=1 uv run pytest tests/test_live.py -s # real renders against your ComfyUI
uv run mcp dev src/comfy_mcp/dev.py # MCP InspectorRoadmap
Next: MiniMax Music 3 (generate_music) through the same job tools, then named multiple ComfyUI servers with a server key per model. Further image models arrive as new model keys on the existing tools rather than new tools.
License
MIT
Available Tools
8 toolscancel_jobA
Cancel one of this server's own jobs: removes it from the ComfyUI queue or interrupts it if running.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It correctly discloses the core action and its two possible effect paths, but it does not mention edge cases like what happens if the job is already finished, whether cancellation is idempotent, or whether partial outputs are preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, dense sentence that front-loads the action and scope, then explains the two possible behaviors. Every part is informative and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one required parameter and an output schema available, so the description need not cover return values. It provides enough context for an agent to choose and invoke the tool correctly, though it omits minor details like failure modes and whether partial results remain accessible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% because job_id has no description. The description indirectly clarifies that job_id must identify 'this server's own jobs,' which adds some meaning beyond the raw schema, but it does not specify the expected format, where to obtain a valid job_id, or any constraints on the value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'cancel' with a clear resource: 'one of this server's own jobs.' It explicitly states the two behavioral outcomes (removing from queue or interrupting if running), which fully differentiates it from siblings like job_status, wait_for_job, and fetch_result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the context of use: canceling a job on this server. It implies a scope constraint ('this server's own jobs') but does not explicitly name alternatives or say when not to use this tool, such as checking job status first or waiting instead of canceling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_imageA
Edit one image, or compose a new image from 2-4 reference images.
model: which image model to use; omit for the configured default. Currently available: "qwen21".
images: 1-4 local file paths (or data:/base64 strings). ORDER MATTERS: the first image is
the base/subject and sets the output canvas (unless width/height are given); it is fitted and
padded, never stretched. Later images are supporting references at ~1 MP.
instruction: start with the operation ("Replace the background with…", "Put the person from
<image1> into the scene from <image2>…"). Say what comes from each reference, what must stay
recognizable and what must change. For placing a subject into a scene: subject FIRST, scene
SECOND, with explicit <image1>/<image2> roles.
Other parameters and the return value match generate_image.
| Name | Required | Description | Default |
|---|---|---|---|
| cfg | No | ||
| save | No | ||
| seed | No | ||
| count | No | ||
| model | No | ||
| steps | No | ||
| width | No | ||
| height | No | ||
| images | Yes | ||
| negative | No | ||
| instruction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly explains how the first image sets the output canvas, is fitted and padded (never stretched), and that later images are supporting references at ~1 MP. It also notes that width/height can override the canvas and defers other behavior to generate_image. This gives valuable insight into image handling, though it does not cover error cases or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured, using indented bullet points for model, images, and instruction. Each line adds value, and the most important usage detail (image order and instruction format) is front-loaded. Some redundancy exists (e.g., repeating the instruction example), but it is justified by complexity. It is not overly verbose for an 11-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, no annotations, and no output schema, the description needs to be comprehensive. It covers the essential parameters and signals that the return value matches generate_image. However, it does not explain the remaining parameters or the exact structure of the output, relying on a sibling tool for those details. An agent cannot fully understand the tool's behavior without consulting generate_image, which introduces a dependency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It thoroughly explains the three most critical parameters: model (available options), images (order, path/base64, role), and instruction (operation-first, explicit roles). However, it does not describe cfg, save, seed, count, steps, negative, width, or height individually, instead deflecting all of them to 'match generate_image.' This cross-reference is helpful only if that sibling's description is equally thorough, making the current tool incomplete on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement: 'Edit one image, or compose a new image from 2-4 reference images.' This establishes the verb (edit/compose), resource (image), and a distinct capability that separates it from the sibling generate_image (text-to-image). The inclusion of concrete operation examples reinforces the purpose without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit operational guidance on how to structure the instruction parameter, including role ordering for subject/scene composition. It implies when to use (when you have an existing image to edit or combine) and naturally distinguishes from generate_image by focusing on reference images. However, it does not explicitly name generate_image as the alternative for text-only generation or state when NOT to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_resultA
Return the images of a finished job (preview + saved path). Fails if the job is not done yet.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the failure behavior (fails if job not done) and the return content (preview + saved path). However, it doesn't disclose whether the save parameter affects the saved path, whether the operation is read-only, or any side effects like writing files to disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose, and the failure condition is stated concisely. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-param tool with no output schema, the description covers the core behavior and failure mode. However, the save parameter's effect is unexplained, and there's no mention of the return format or how the saved path is provided. Given the sibling tools, an agent might benefit from knowing this is the retrieval step after wait_for_job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains job_id implicitly (identifies the job) and save is mentioned only as 'saved path' in the return, but the description doesn't clarify what the save boolean does. The description adds some meaning but leaves the key parameter save ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns images of a finished job, including preview and saved path, and explicitly notes it fails if the job is not done. This distinguishes it from siblings like job_status (which likely just reports status) and wait_for_job (which waits), though it doesn't name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it: after a job is finished, and warns it fails if not done. This implicitly guides the agent to use wait_for_job or job_status first. However, it doesn't explicitly name alternatives or state when not to use it beyond the failure condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_imageA
Generate new image(s) from a text prompt.
model: which image model to use; omit for the configured default. Currently available: "qwen21"
(Qwen Image 2.1). list_models shows what is installed and ready.
Canvas: give width and height (multiples of 32, default 1024×1024) or an aspect preset:
square, landscape (1344×768), portrait (768×1344), wide (1536×640), tall (640×1536).
seed: omit for random; the seed used is always returned so a result can be reproduced.
steps default 25, cfg default 1.0 (Qwen 2.1 works best at cfg 1.0; a negative prompt only
matters when cfg > 1). count 1-4 images in one run.
save=true writes full-size PNGs to the configured output folder and returns their paths plus
a small preview of each; save=false returns base64 PNG in the text instead of writing files.
Blocks until done (typically 20-60 s). If it returns JSON with a job_id, the server was busy:
use wait_for_job(job_id).
| Name | Required | Description | Default |
|---|---|---|---|
| cfg | No | ||
| save | No | ||
| seed | No | ||
| count | No | ||
| model | No | ||
| steps | No | ||
| width | No | ||
| aspect | No | ||
| height | No | ||
| prompt | Yes | ||
| negative | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and succeeds. It discloses blocking behavior and typical timing, the difference between writing files and returning base64, that the seed is always returned for reproducibility, and what to do if a job_id appears. This is rich operational behavior that an agent could not infer from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is densely informative and organized by parameter area. Each line adds a necessary constraint, default, or behavioral fact, and the core purpose is front-loaded. Nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with 11 parameters, no annotations, and no output schema, this description is complete. It covers input choices, defaults, output modes, timing, reproducibility, and async fallback behavior. An agent has what it needs to call the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description is the only source of parameter meaning. It explains every parameter: model, canvas/aspect, seed, steps, cfg, count, save, prompt, and negative, including defaults and constraints such as multiples of 32 and count 1-4. This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Generate new image(s) from a text prompt,' a specific verb and resource. The word 'new' distinguishes it from the edit_image sibling, and the rest of the description stays focused on generation rather than manipulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete routing guidance: use list_models to see installed models, and if the server returns a job_id, use wait_for_job(job_id). It also explains when save=false is useful and notes that negative prompts only matter when cfg > 1, which is practical selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_statusA
Peek at a job returned by generate_image/edit_image without waiting.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden. It conveys read-only character via 'peek' and non-blocking behavior via 'without waiting.' However, it does not disclose error behavior, repeated-call safety, or whether any side effects occur; these are not fully covered elsewhere since no annotations exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. The key action and behavioral distinction ('without waiting') are front-loaded, and the source of the job_id is stated efficiently. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema, the description is nearly adequate. It gives the parameter source and the non-waiting behavior, while the output schema likely covers return values. It omits error handling and alternative routing, but these are less critical given the sibling tools and simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by specifying the provenance of job_id – it is the identifier returned by generate_image/edit_image – which is contextual meaning the schema lacks. It does not describe format or constraints, but for a single required parameter this is valuable guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('peek') and a clear resource ('a job returned by generate_image/edit_image'), immediately conveying that this tool checks job status. The phrase 'without waiting' effectively distinguishes it from siblings like wait_for_job and fetch_result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by stating the tool is for peeking without waiting, implying it is the non-blocking counterpart to wait_for_job. It also establishes that the job must have been created by generate_image or edit_image. It does not explicitly enumerate alternatives or exclusion cases, but the primary usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsA
List the image models this server can drive (keys for the model parameter) with their readiness,
plus everything ComfyUI currently has installed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states that the tool is a listing operation returning models with readiness and installed ComfyUI items, which is transparent about its read-only nature. However, it does not mention potential latency, output size, or any side effects. The behavior is adequately conveyed but not enriched beyond the literal action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the main action ('List the image models') and packs in the key detail about `model` keys. It is a bit dense with the second clause about ComfyUI installations, but every part contributes meaning. No filler words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero params) and the presence of an output schema, the description is complete enough to call the tool correctly. It explains what will be returned (models with readiness, plus installed items) and why the output matters (`model` parameter keys). No critical information is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides no parameter semantics. The description adds value by explaining that the output contains keys for the `model` parameter elsewhere, giving the output practical meaning beyond a bare list. This exceeds the baseline of 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies exactly what the tool does: it lists image models the server can drive, with readiness, and everything ComfyUI has installed. The mention of 'keys for the `model` parameter' clearly ties the output to model selection for generation/editing tools, distinguishing it from siblings like server_status or job_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need valid values for the `model` parameter. This is clear context, though it does not explicitly say 'use before generate_image' or name alternatives. It gives enough context for an agent to infer the appropriate use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusA
Check the ComfyUI server: reachability, version, GPU memory, queue length and whether someone else's job is running (this MCP always queues behind it).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 a significant behavioral trait: 'this MCP always queues behind it,' indicating that calls to this tool will queue behind any running job on the server. It also clarifies the read-only nature of checking status (reachability, version, memory, queue), with no destructive actions implied. This goes beyond a generic 'check status' statement and provides useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that leads with the action ('Check the ComfyUI server:') and then lists the specific check items. The queueing behavior is added as a parenthetical note, keeping the structure compact without redundancy. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters and an output schema, the description fully captures what the agent needs to understand before calling it: what can be checked, what the queueing behavior is, and implicitly that it is a non-destructive status probe. Nothing critical is missing; the output schema covers return values, so the description need not explain them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is complete (coverage 100%). Per the rubric, a zero-parameter tool gets a baseline of 4, and the description does not need to add any parameter semantics. There is nothing missing or ambiguous about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Check') and a clear resource ('ComfyUI server'), then enumerates the exact things checked (reachability, version, GPU memory, queue length, and whether someone else's job is running). This makes it unambiguous what the tool does and naturally distinguishes it from sibling tools like generate_image or job_status, even though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage – an agent would infer that this is for checking server status before or during operations – but it does not explicitly say when to use it versus alternatives. There is no mention of 'use this to verify server health before submitting a job' or any exclusions. The queueing behavior hints at a practical consideration, but the when-to-use guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_jobA
Block up to timeout seconds for a job to finish. Returns the images (preview + saved path)
when done, or the job status JSON if still running.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| job_id | Yes | ||
| timeout | No |
TDQS
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 well: it discloses blocking behavior, the timeout limit, and the two possible return payloads. It could additionally indicate what happens on error or whether this has side effects, but for a waiting operation the behavior is clearly communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with no filler. It front-loads the core action and timeout, then the return behavior, earning every word it uses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The core behavior and return values are covered, which is good given there is no output schema. However, for a tool with zero annotation and schema description coverage, the missing parameter explanations and lack of guidance for choosing this over job_status leave meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to explain all three parameters. It only mentions `timeout` in seconds and the notion of a saved path, which indirectly relates to `save`, but it never defines `job_id` or the exact meaning/effect of `save` as a boolean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Block up to `timeout` seconds') on a specific resource ('a job'), and explains the two possible return outcomes. This clearly distinguishes it from siblings like job_status and fetch_result by emphasizing the blocking wait behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you want to block until a job completes, with a timeout fallback returning the status JSON. However, it never explicitly contrasts this with non-blocking alternatives like job_status or explains when someone should prefer one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
cancel_job - First observed
edit_image - First observed
fetch_result - First observed
generate_image - First observed
job_status - First observed
list_models - First observed
server_status - First observed
wait_for_job
TDQS
Scored across 8 tools
Each tool targets a distinct concern: generation, editing, server/model inspection, and job lifecycle management. The job-related tools (status, wait, fetch, cancel) are clearly differentiated by their blocking behavior and return payload.
Most tools follow a clear verb_noun pattern: generate_image, edit_image, list_models, fetch_result, cancel_job. The two status tools (server_status, job_status) are noun-first, which is a minor deviation but still readable and internally consistent.
Eight tools is well-scoped for an image generation/editing server with asynchronous job support. Each tool serves a clear purpose without redundancy or bloat.
The surface covers the full generation/edit workflow plus model discovery, server health, and complete job lifecycle management (status, wait, fetch, cancel). No critical operations are missing for the stated domain.
Maintenance
Related MCP Connectors
Remote MCP for RunComfy: ComfyUI deployments, hosted models, LoRA training. 31 tools.
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
Design, save, and run outcome-aligned AI workflows and verifiers, with reliable image output.
Uncensored image, image-to-video and chat generation for adult apps. OpenAI-compatible, pay per use.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to generate and iteratively refine images, audio, and video by interacting with a local ComfyUI instance through natural conversation. It provides comprehensive tools for workflow management, node introspection, and publishing generated assets.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to generate and iteratively refine images, audio, and video through natural conversation using a local ComfyUI instance.AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceGive AI agents full control over your local ComfyUI by exposing 77 tools for workflow management, image generation, model handling, and real-time canvas control.3AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceExposes ComfyUI workflows as 12 MCP tools on ComfyUI's own port, letting AI agents generate, edit, and remove backgrounds from images plus create videos by passing semantic parameters instead of whole workflow graphs. Agents can list models, submit and track async tasks, fetch artifact URLs, and jump to a visual asset/task page.2MIT