Skip to main content
Glama

flux-mcp

An MCP server that lets any MCP client (Claude Code, Claude Desktop, Open WebUI, your own agents) generate and edit images with FLUX 3 Image Klein, running locally in ComfyUI.

MCP client ──streamable HTTP + bearer token──▶ flux-mcp :8300 ──HTTP──▶ ComfyUI :8188 (GPU)

flux-mcp has no GPU or model code: it fills a ComfyUI workflow, submits it, waits, and returns a JPEG preview plus a link to the full-resolution PNG. It is built on mcp-service-kit, which provides the transports, CLI and configuration.

Tools

Tool

What it does

generate_image(prompt, width=1024, height=1024, count=1, seed?, steps?, enhance_prompt=true, quality="fast")

Text to image. quality="high" uses the undistilled Klein Base model (50 steps, CFG 4): more detail and variety, about 3× slower

edit_image(prompt, images, width?, height?, count=1, seed?, steps?, enhance_prompt=true, quality="fast")

Edit an image, or compose a new one from up to 10 reference images. images lists ids (from previous results) or http(s) URLs; the prompt refers to them by order ("the fox from the first image on the porch from the second image"). Output keeps the first image's aspect ratio at about 1 MP unless a size is given

upscale_image(image, factor=2)

Enlarge 2× or 4× with Real-ESRGAN (output ≤ 8192 px per side)

remove_background(image)

Cut out the subject onto a transparent PNG (BiRefNet)

get_image(image?)

Show a stored image again with its prompt, seed, caption and model; without an id, the latest image (recovers a call that timed out on the client)

unload_models()

Free the models' GPU memory now; they reload on the next request

list_models()

Workflows and the model files ComfyUI sees

server_status()

ComfyUI version, queue length, free memory, whether models are loaded and when they will be unloaded

Each image result contains a text block with the seed and full-resolution URL (<FLUX_PUBLIC_BASE_URL>/images/<id>.png), one JPEG preview (longest side ≤ 1024 px) per image, and structured content {seed, width, height, images: [{id, url}]}.

What made each image. Results include the caption the prompt upsampler actually sent to the model, so you can see how a request was interpreted. Every stored PNG also carries a flux-mcp iTXt chunk with JSON: tool, prompt, seed, quality, size, model, steps, input images, boxes, caption and time. get_image shows it, as does any tool that lists PNG text chunks (for example exiftool image.png, or Pillow's Image.open(path).text["flux-mcp"]).

Prompt upsampler. FLUX 3 Klein expects full scene captions; a short prompt as typed gives generic results. By default (enhance_prompt=true) the request first goes through Black Forest Labs' Qwen3.5-9B prompt upsampler. Turn it off only when the client writes a complete caption.

Limits (configurable): sides 256–4096 px (rounded to multiples of 16), up to 4 images per call, prompts up to 4000 characters, edit inputs up to 20 MB, 300 s per call.

Related MCP server: Universe Imagine MCP

Layout with bounding boxes

generate_image and edit_image take optional boxes. Each box is {"bbox": [y_min, x_min, y_max, x_max], "desc": "...", "text": "..."} on a 0–1000 grid with (0, 0) at the top left, stretched over the canvas; text is optional and rendered verbatim. Boxes guide placement and scale; they are not hard masks.

{"prompt": "a snowy forest clearing", "width": 1536, "height": 1024, "boxes": [
  {"bbox": [350, 60, 950, 420], "desc": "a red fox sitting, facing right"},
  {"bbox": [250, 600, 800, 950], "desc": "a weathered wooden trail sign", "text": "FOX TRAIL"}]}

For edit_image, boxes mark regions of the first image and are named obj_1, obj_2, … in order, so the prompt can say "remove obj_1" or "replace obj_2 with a bicycle". Behind the scenes the prompt upsampler switches to BFL's box-aware system prompts (workflows/prompts/*_bbox.txt); with enhance_prompt=false the element table is appended to your caption, as ComfyUI's Flux3LayoutPrompt does.

Uploading your own images

Tools take image ids, so upload an image first and use the returned id:

curl -H "Authorization: Bearer $FLUX_MCP_TOKEN" -F file=@photo.jpg http://10.0.0.96:8300/upload
# {"id": "1329da32…", "url": "http://10.0.0.96:8300/images/1329da32….png", "width": 1776, "height": 1184}

Agents with a shell (Claude Code, Cline, opencode) can run this themselves; the server's instructions tell them how. In a browser, open http://10.0.0.96:8300/upload, paste the token, and drop images to get their ids. Images pasted into a chat cannot be forwarded to a tool: the model only receives them, it cannot hand the bytes on. Uploads are limited to FLUX_MAX_INPUT_BYTES (20 MB) and stored as PNG.

Models

The weights are in the gated repo black-forest-labs/flux-3-image-klein-comfy (FLUX Kommunity License; accept it on that page with the account your HF_TOKEN belongs to).

cd /mnt/shared/huggingface/comfyui     # the MODELS_DIR mounted into ComfyUI
for f in diffusion_models/flux3-image-klein-nvfp4.safetensors \
         diffusion_models/flux3-image-klein-base-nvfp4.safetensors \
         text_encoders/qwen3vl_4b_bf16.safetensors \
         text_encoders/qwen3.5_9b_flux3_prompt_upsampler_w4a8.safetensors \
         vae/flux2-vae.safetensors; do
  uvx --from 'huggingface_hub[cli]' hf download black-forest-labs/flux-3-image-klein-comfy "$f" --local-dir .
done
uvx --from 'huggingface_hub[cli]' hf download Comfy-Org/BiRefNet background_removal/birefnet.safetensors --local-dir .
mkdir -p upscale_models && curl -L -o upscale_models/RealESRGAN_x4plus.pth \
  https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth

File

Size

Role

flux3-image-klein-nvfp4.safetensors

5.3 GB

distilled transformer, NVFP4 (Blackwell)

qwen3vl_4b_bf16.safetensors

8.9 GB

text encoder

qwen3.5_9b_flux3_prompt_upsampler_w4a8.safetensors

6.7 GB

prompt upsampler

flux2-vae.safetensors

0.3 GB

VAE

flux3-image-klein-base-nvfp4.safetensors

5.3 GB

undistilled base model, for quality="high"

upscale_models/RealESRGAN_x4plus.pth

64 MB

upscaler (BSD-3-Clause)

background_removal/birefnet.safetensors

0.4 GB

background removal (MIT)

To use other files (int8, bf16, the base checkpoint), edit the loader nodes in workflows/*.json.

Performance (DGX Spark / GB10, next to a running vLLM)

Measured through the MCP endpoint, 1024×1024, one image, 16 steps:

Call

Time

First call after ComfyUI starts (loads ~21 GB of weights from NFS)

~260 s

generate_image, upsampler on

~17 s

generate_image, enhance_prompt=false

~8.5 s

edit_image, one reference, upsampler on

~29 s

edit_image, two references, 1536×1024

~45 s

generate_image with two boxes, 1536×1024

~27 s

generate_image, quality="high"

~46 s (~58 s when the base model loads)

upscale_image 2× / 4× from 1024²

~10 s / ~11 s

remove_background, 1024²

~2 s

generate_image right after an idle unload (models reload)

~25 s

Memory: an unload (idle or unload_models) gave back about 18–19 GB. With the fast-mode models loaded, the host's available memory dropped by about 10 GB (the rest came out of page cache); with the base model resident as well, about 27 GB stayed available next to vLLM. Clients with a short tool-call timeout should allow at least 60 s (120 s for quality="high"), or more for the first call; flux-mcp sends progress notifications while it waits.

Run

cp .env.example .env
sed -i "s/^FLUX_MCP_TOKEN=.*/FLUX_MCP_TOKEN=$(openssl rand -hex 32)/" .env
docker compose up -d --build
docker compose logs -f flux-mcp

The ComfyUI web UI is at http://<host>:8188, the MCP endpoint at http://<host>:8300/mcp. Both are meant for the LAN only: ComfyUI has no authentication, and image URLs are protected only by their random ids.

Configuration (environment or .env):

Variable

Default

FLUX_MCP_TOKEN

—

bearer token; required for HTTP unless --no-auth

FLUX_COMFYUI_URL

http://localhost:8188

compose sets http://comfyui:8188

FLUX_PUBLIC_BASE_URL

http://localhost:8300

base of the image URLs returned to clients

FLUX_OUTPUT_DIR

data/images

FLUX_IDLE_UNLOAD_S

600

unload ComfyUI's models after this many idle seconds, freeing memory for other GPU users such as vLLM (0 = never). The next call then reloads them (~25 s from page cache, or minutes after a ComfyUI restart)

FLUX_WORKFLOWS_DIR

workflows

FLUX_MAX_SIDE, FLUX_MIN_SIDE, FLUX_MAX_COUNT, FLUX_MAX_PROMPT_CHARS, FLUX_MAX_INPUT_BYTES, FLUX_TIMEOUT_S, FLUX_PREVIEW_MAX_SIDE

see config.py

limits

MCP_PORT, MCP_HOST

3000, 0.0.0.0

from mcp-service-kit (the image sets MCP_PORT=8300)

Without Docker (server only)

uv sync
FLUX_MCP_TOKEN=... FLUX_COMFYUI_URL=http://10.0.0.96:8188 uv run flux-mcp --mode http --port 8300
uv run flux-mcp --mode stdio      # for local clients that launch the server themselves

Connect a client

Any MCP client that supports streamable HTTP: URL http://10.0.0.96:8300/mcp, header Authorization: Bearer <FLUX_MCP_TOKEN>.

Claude Code

claude mcp add --transport http flux http://10.0.0.96:8300/mcp \
  --header "Authorization: Bearer $FLUX_MCP_TOKEN"

Claude Desktop (claude_desktop_config.json, via stdio on the same machine as ComfyUI or with FLUX_COMFYUI_URL pointing at it):

{
  "mcpServers": {
    "flux": {
      "command": "uv",
      "args": ["--directory", "/path/to/flux-mcp", "run", "flux-mcp", "--mode", "stdio"],
      "env": {"FLUX_COMFYUI_URL": "http://10.0.0.96:8188"}
    }
  }
}

In stdio mode, image URLs point at FLUX_PUBLIC_BASE_URL, which only works while an HTTP instance serves the same FLUX_OUTPUT_DIR; the inline previews always work.

Open WebUI: Settings → External Tools → add an MCP (Streamable HTTP) server with the URL above and the bearer token.

MCP Inspector: npx @modelcontextprotocol/inspector, transport "Streamable HTTP", same URL and header.

Workflows

workflows/flux3_klein_t2i.json and flux3_klein_edit.json are ComfyUI API-format graphs, flattened by hand from Black Forest Labs' Klein templates (MIT, in the model repo's workflows/). workflows/nodes.yaml maps tool parameters to node inputs and describes the upsampler nodes and the reference-image inputs (extra references get copies of the image loader node, wired into the reference and upsampler nodes), so you can swap models or add a workflow without code changes. To start from a workflow built in the web UI, use Export (API) and map its node ids in nodes.yaml.

Development

uv sync
uv run pytest        # fake ComfyUI over httpx.MockTransport; no GPU needed
uv run ruff check

How the pieces fit together, with diagrams: docs/ARCHITECTURE.md.

Layout follows mcp-service-kit's example: server.py (server, auth, main), service.py (tool discovery, image route), features/*/tool.py (one tool each), flux_service.py and comfy_client.py (business logic, no MCP imports), workflows.py, images.py, config.py.

License

Code: Apache License 2.0, see LICENSE. FLUX 3 Image Klein weights: FLUX Kommunity License. Text encoder and prompt upsampler: Apache-2.0. Workflow templates: MIT (Comfy Org).

Available Tools

8 tools
edit_imageEdit ImageA

Edit an image, or combine several reference images, with FLUX 3 Image Klein

With one image, describe the change ("make the sky stormy", "add a red scarf to the dog"). With several, say what to take from each by order ("the woman from the first image standing in the forest from the second image"). Returns a JPEG preview of each result plus the URL and id of the full-resolution PNG.

NameRequiredDescriptionDefault
seedNoSeed for a reproducible result
boxesNoOptional regions of the FIRST image, same format as generate_image boxes. They are named obj_1, obj_2, ... in order; refer to them in the prompt ("remove obj_1", "replace obj_2 with a bicycle", "move obj_1 to the right").
countNoNumber of variations
stepsNoSampling steps; leave unset for the model default
widthNoOutput width; default keeps the first image's aspect ratio
heightNoOutput height; default keeps the first image's aspect ratio
imagesYes1 to 10 reference images, in order: ids from generate_image/edit_image, or http(s) URLs
promptYesThe change to make, or the result you want. Refer to several images by order: 'the first image', 'the second image'.
qualityNo'high' uses the undistilled base model: more detail, about 3 times slower (~45 s). Use only when the user asks for it.fast
enhance_promptNoExpand the request into a full edit instruction first (recommended)

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations at all, the description carries the full behavioral burden, and it does disclose the return shape — JPEG previews per result plus URL and id of the full-resolution PNG — which is information an agent cannot get elsewhere since there is no output schema. It omits cost, latency expectations (except what quality hints at in the schema), and whether results are retained or how long the returned URLs live.

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?

Three short sentences, front-loaded with the capability, then the single-image case, the multi-image case, and the return format. Every sentence carries distinct information and the example phrasings are short enough to be read rather than skipped.

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 ten-parameter mutation tool with no annotations and no output schema, the description covers the essentials: what it does, how to prompt for both modes, and what comes back. The gaps — no explicit routing to generate_image, no cost or timing, no mention of optional knobs like boxes or quality — are real but secondary given how much the 100%-covered schema carries.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all ten parameters including boxes, count, quality, and enhance_prompt, making 3 the baseline. The description reinforces prompt semantics with worked examples ('the woman from the first image standing in the forest from the second image'), which adds real value beyond the terse schema text, but it never touches boxes, quality, or count.

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?

States a specific verb and resource ('Edit an image, or combine several reference images') plus the backing model, and the one-vs-many framing immediately conveys the two modes. It stops short of explicitly contrasting with generate_image, which is the closest sibling and the main source of confusion for an agent choosing between creating and editing.

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 gives genuinely useful in-tool guidance: how to phrase a single-image edit and how to reference multiple images by order, with concrete example phrasings. It says nothing about when to pick this over generate_image, upscale_image, or remove_background, and no exclusions or prerequisites (e.g., that images are required, source of those images) are stated.

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

generate_imageGenerate ImageA

Generate images from a text description with FLUX 3 Image Klein

Returns a JPEG preview of each image plus the URL and id of the full-resolution PNG. Use the id with edit_image to refine a result.

NameRequiredDescriptionDefault
seedNoSeed for a reproducible result
boxesNoOptional layout: where to place elements. Each box is {"bbox": [y_min, x_min, y_max, x_max] on a 0-1000 grid with (0, 0) at the top left, "desc": what goes there, "text": exact text to render (optional)}. Boxes guide placement and scale, not exact pixels.
countNoNumber of variations
stepsNoSampling steps; leave unset for the model default
widthNoWidth in pixels (rounded to 16)
heightNoHeight in pixels (rounded to 16)
promptYesWhat to draw. A short request is fine.
qualityNo'high' uses the undistilled base model: more detail and variety, about 3 times slower (~45 s). Use only when the user asks for it.fast
enhance_promptNoExpand the prompt into a full scene caption first (recommended)

TDQS

A3.6/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. It does disclose the return shape (JPEG preview plus URL and id of the full-resolution PNG), which is valuable, but says nothing about generation latency, cost, failure modes, or how count variations are returned.

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?

Three short sentences with zero waste; the purpose is front-loaded and the return-value and follow-up details come after. Every sentence earns its place.

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 9-parameter generation tool with no output schema, the description covers the two things the schema cannot: what comes back and how to chain into edit_image. Latency and cost expectations are the main remaining gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents prompt, quality, seed, boxes, and dimensions thoroughly. The description adds no parameter-level meaning beyond what is structured, so the baseline 3 applies.

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?

States a specific verb and resource (generate images from a text description) and names the model used. It is distinguishable from edit_image because it names that sibling as the refinement path, but it does not explicitly contrast generation-from-scratch with editing.

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 only routing guidance is the closing sentence pointing to edit_image for refinement of a returned id – useful for the follow-up step, but it never states when to choose this tool over its siblings for an initial request or what prerequisites exist.

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

get_imageGet ImageA

Show a stored image again, with how it was made

Returns the preview, URL and stored details (prompt, seed, upsampled caption, model). Without an id it returns the most recent image, which also recovers the result of a call that timed out on the client side.

NameRequiredDescriptionDefault
imageNoImage id or URL from this server; leave empty for the latest image

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does reasonably well: it names the returned fields (preview, URL, prompt, seed, upsampled caption, model) and the default behavior when no id is given. It omits access/permission behavior and error cases when an id is invalid.

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 content is front-loaded with the main action and return contents, followed by the default and recovery case. Every sentence is relevant, though the phrasing is slightly dense.

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 single-parameter read tool with no output schema, the description explains return contents and the no-id default, which is sufficient to invoke it correctly. Minor gaps around invalid-id behavior and permissions keep it from a 5.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already defines the single 'image' parameter and its default. The description only restates the empty-id default behavior, adding little beyond structured data; baseline 3 applies.

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 gives a specific verb and resource (show a stored image) plus a secondary purpose (how it was made). It implicitly distinguishes retrieval from generate_image/edit_image, though it doesn't name any sibling 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?

It states a concrete usage condition: without an id it returns the most recent image, and it names a recovery use case for client-side timeouts. There is no explicit when-not or named alternative, but the 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_modelsList ModelsA

List the workflows this server runs and the model files ComfyUI can see

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations exist, so the description carries the burden; it does convey that this is a pure enumeration with no mutation of files. However, it says nothing about whether the results reflect on-disk models vs. loaded models, whether the server must be reachable, or how the two resources are separated in the response.

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 front-loaded sentence with no filler; both returned resource types are named up front. Every word earns its place.

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?

With no parameters and an output schema present, the description needn't explain the return shape, and it correctly identifies what is listed. The only missing piece is the operational precondition (a reachable ComfyUI server) and the distinction from server_status.

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 takes zero parameters, so the baseline is 4 and there is nothing further the description needs to document. Nothing in the description conflicts with the empty schema.

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?

States a specific verb ('List') plus two concrete resources: the server's workflows and the model files ComfyUI can see. An agent can tell this is a discovery/enumeration call, though it never explicitly contrasts itself with the similarly-named sibling server_status or unload_models.

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?

Usage is only implied — an agent can infer this is the discovery step before generate_image or edit_image, but the description never says when to call it, when not to, or which sibling covers overlapping information. No prerequisites (e.g. server must be running) are noted.

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

remove_backgroundRemove BackgroundA

Cut out the main subject and make the background transparent (BiRefNet)

Returns a transparent PNG (the preview shows it on white) plus its URL and id.

NameRequiredDescriptionDefault
imageYesImage id from this server, or an http(s) URL

TDQS

A3.8/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, and it does add real value: it discloses the output artifact (transparent PNG), the preview-on-white rendering quirk, and the returned URL and id. However, it says nothing about latency or model-loading behavior, which matters given the unload_models sibling, nor about input limits or failure modes.

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 tightly-written sentences: the operation and model come first, the return contract second. Every clause carries information 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?

No output schema exists, but the description compensates by naming the return type, preview rendering, URL and id. For a one-parameter read-like transform tool this is nearly sufficient; only execution cost/model-loading context is missing.

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

Parameters3/5

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

There is a single required parameter and schema description coverage is 100%, so the schema already explains that 'image' accepts a server image id or an http(s) URL. The description adds nothing parameter-specific beyond implying a single main subject, so baseline 3 applies.

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?

States a specific verb ('cut out') and resource ('main subject') with a concrete effect ('make the background transparent'). It also names the underlying model (BiRefNet), and no sibling (edit_image, upscale_image, generate_image) performs background removal, so the agent can select it unambiguously.

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?

Usage is only implied by the operation name and the phrase 'main subject' – the agent can infer it takes an existing image and removes the background. There is no explicit statement of when to prefer this over edit_image, nor any exclusions or prerequisites (e.g. images with multiple subjects).

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

server_statusServer StatusA

Report whether ComfyUI is up, its queue, free memory and whether models are loaded

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/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 burden. 'Report' strongly implies a read-only operation, and the listed checks (up status, queue, memory, model loading) add useful scope, but there is no explicit statement that the tool is non-mutating, has no side effects, or has no auth/rate-limit constraints.

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 front-loaded sentence with no filler. Every clause maps to a concrete status signal the tool reports.

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 zero-parameter status tool with an output schema, the description is nearly complete: it lists the core status dimensions an agent would need before invoking it. It falls short only by omitting explicit read-only/no-side-effect context, which matters because no annotations are present.

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 takes zero parameters, so the baseline is 4. The description correctly does not discuss parameter semantics, and there is nothing missing because no inputs exist.

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 states a specific verb ('Report') and resource (ComfyUI server status), and enumerates the exact signals returned: uptime, queue, free memory, and loaded-model status. It is clearly distinguishable from the action-oriented siblings such as generate_image and unload_models, though it does not explicitly name or contrast them.

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

Usage Guidelines2/5

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

The description explains what the tool reports but gives no explicit guidance on when to call it, when not to call it, or which sibling to use instead. An agent can infer that this is a health-check tool, but that inference is not stated.

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

unload_modelsUnload ModelsA

Free the GPU memory held by the image models now

The models reload automatically on the next request, which then takes longer. The server also does this by itself after a period without requests.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the side effect (memory freed), the cost (models reload on the next request, which is slower), and that this is normally automatic. It does not say whether in-flight requests are interrupted or whether all loaded models or only some are unloaded, which is a real gap for a state-changing operation.

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?

Three short lines with the action front-loaded and the consequence and default behavior following in descending order of importance. Every sentence contributes new information; nothing is padding.

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

Completeness4/5

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

An output schema exists and there are no parameters, so the description only needs to cover behavior, which it does: effect, reload penalty, and automatic fallback. The remaining gap is concurrency/interruption semantics for a mutation-style tool with no annotations to lean on.

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 takes zero parameters, so per the baseline this scores 4. Nothing in the description is needed to explain inputs, and it correctly mentions a scope qualifier ('the image models') rather than implying any selectable argument.

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?

States a specific verb and resource: 'Free the GPU memory held by the image models'. No sibling tool (generate_image, upscale_image, list_models, server_status) deals with memory lifecycle, so the purpose is unmistakably distinct without needing an explicit comparison.

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?

'Free ... now' plus the note that the server already does this automatically after an idle period implicitly tells the agent that manual invocation is only warranted when memory must be reclaimed immediately. That is clear context, but it stops short of an explicit when-to-use / when-not-to-use statement or escalation guidance.

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

upscale_imageUpscale ImageA

Enlarge an image 2x or 4x with an upscaling model (Real-ESRGAN)

Adds sharpness rather than new content; use it for prints and wallpapers. Takes a few seconds. Returns a preview plus the URL and id of the full-resolution PNG.

NameRequiredDescriptionDefault
imageYesImage id from this server, or an http(s) URL
factorNoEnlargement factor

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses expected latency ('takes a few seconds') and the return shape (preview plus URL and id of the full-resolution PNG). It leaves unstated whether a new image is persisted or how it interacts with the source image, and no output schema exists to fall back on.

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?

Three short sentences, front-loaded with the action and scaling choices, followed by the differentiator, latency, and return value. No filler or restated title.

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 two-parameter tool with no annotations and no output schema, the description covers purpose, latency, and return values, which is nearly everything an agent needs. The remaining gap is input-source behavior (id vs URL) and whether results are persisted or return-only.

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

Parameters3/5

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

Schema description coverage is 100%, and the enum for factor is already fully documented, so the description only echoes the 2x/4x choice. It adds nothing about the 'image' parameter, such as what happens when a stock/server id versus a remote http(s) URL is supplied.

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?

States a specific verb and resource ('Enlarge an image 2x or 4x') and names the underlying model (Real-ESRGAN). The clause 'Adds sharpness rather than new content' cleanly separates it from the sibling generate_image and edit_image, so an agent can route without opening a schema.

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?

Gives a concrete use case ('prints and wallpapers') and a negative qualifier that rules out content-adding scenarios, which implicitly points at generate_image. It stops short of explicitly naming when not to use it (e.g., small inputs, non-photo assets) or naming alternatives by name.

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 observededit_image
    • First observedgenerate_image
    • First observedget_image
    • First observedlist_models
    • First observedremove_background
    • First observedserver_status
    • First observedunload_models
    • First observedupscale_image

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a clearly distinct action on the image pipeline: generate, edit, upscale, background removal, retrieve, plus model/server administration. The descriptions explicitly delineate the boundaries (e.g. upscale 'adds sharpness rather than new content', edit requires an id from generate), so an agent can select correctly without guessing.

Naming Consistency4/5

Seven of eight tools follow a clean verb_noun snake_case pattern (generate_image, edit_image, upscale_image, remove_background, get_image, list_models, unload_models). The only deviation is 'server_status', which is noun-first, but it remains readable and unambiguous.

Tool Count5/5

Eight tools is well within the ideal 3-15 range and every tool earns its place: four core image operations, one retrieval tool, and three operational/admin tools. Nothing looks redundant or like padding.

Completeness4/5

The core lifecycle (generate → edit → upscale → cutout → retrieve) is fully covered, along with model listing and GPU management. Minor gaps remain: there is no way to enumerate stored images (only fetch by id or 'most recent') and no delete/cleanup operation, but agents can work around these using returned ids.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers