Skip to main content
Glama

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 model key, 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 qwen21 that 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_models tells 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 bundled SaveImageWebsocket custom node (ships with ComfyUI in custom_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 status

Or 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_TOKEN

Add 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-mcp

Codex~/.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 config

then 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>.png

The 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

qwen21

Qwen Image 2.1

generate_image, edit_image

bundled

minimax_h3

MiniMax H3 video (with sound)

generate_video

bundled; needs VideoHelperSuite

MiniMax Music 3

generate_music

planned

Krea2, Ideogram 4, FLUX.2 Klein

generate_image, edit_image

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-attention flag off with H3.

  • fused_modulation and chunk_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_height and are upscaled with a small SPAN model (upscale_model in models/upscale_models) back to the final canvas; caching is not applied to drafts because turbo schedules have little to reuse.

  • steps on generate_video overrides the step count; final_steps / draft_steps set 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 in mcp.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_WAIT in the server entry's env. The call then returns a job_id in time and the model finishes with wait_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

generate_image(prompt, model?, negative?, width?, height?, aspect?, seed?, steps?, cfg?, count?, save?)

Text to image. model defaults to the configured default (qwen21). aspect presets: square, landscape, portrait, wide, tall.

edit_image(instruction, images[], model?, negative?, width?, height?, seed?, steps?, cfg?, count?, save?)

Edit one image or compose from 2–4. images are local paths or base64. First image = base and canvas.

generate_video(prompt, model?, mode?, images[]?, audio?, seconds?, orientation?, draft?, seed?, steps?, save?, wait?)

5–15 s clip with sound. mode: t2v, i2v (first frame, optional last), r2v (1–3 references), refav (references + audio). Async: returns a job_id; finish with wait_for_job(job_id, timeout=600). draft=true is an 8-step turbo preview rendered at a smaller canvas and upscaled to full size. steps overrides the step count.

server_status()

Version, GPU memory, queue counts, whether a foreign job is running, our active jobs.

list_models()

The model keys this server can drive, each with its configured files and readiness (what's missing), plus everything ComfyUI has installed.

job_status(job_id), wait_for_job(job_id, timeout?), fetch_result(job_id), cancel_job(job_id)

Used when a call outlasts max_wait and returns a job id instead of images.

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); no SaveImage, nothing in ComfyUI's output/.

  • 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 (never output/), 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=temp under random names and referenced as name [temp]. Nothing goes to input/. 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. --debug prints 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 Inspector

Roadmap

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 tools
cancel_jobA

Cancel one of this server's own jobs: removes it from the ComfyUI queue or interrupts it if running.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/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 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
cfgNo
saveNo
seedNo
countNo
modelNo
stepsNo
widthNo
heightNo
imagesYes
negativeNo
instructionYes

TDQS

A4/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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

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: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveNo
job_idYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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).
    
ParametersJSON Schema
NameRequiredDescriptionDefault
cfgNo
saveNo
seedNo
countNo
modelNo
stepsNo
widthNo
aspectNo
heightNo
promptYes
negativeNo

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 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/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 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.

Conciseness5/5

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.

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 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveNo
job_idYes
timeoutNo

TDQS

A3.8/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 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 8 tool updatesv0.1.0
    • First observedcancel_job
    • First observededit_image
    • First observedfetch_result
    • First observedgenerate_image
    • First observedjob_status
    • First observedlist_models
    • First observedserver_status
    • First observedwait_for_job

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers