Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.artokun/comfyui-mcp

NPM · COMFYUI-MCP · SCANNED SEP 21

MCP server + Claude Code plugin for ComfyUI: run workflows, generate images, manage models & VRAM.

Available components

+12 this week 91 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security99
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 41 of 216 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to artokun/comfyui-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 11 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability57
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 43133 tokens (~1052/item across 41 items; 41 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety88
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 1 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "call_tool" implies "execute" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Partial
  • An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the io.github.artokun/comfyui-mcp server?

io.github.artokun/comfyui-mcp runs locally as an npm package, launched with npx -y comfyui-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · comfyui-mcp

# add to Claude Code
claude mcp add artokun-comfyui-mcp -- npx -y comfyui-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "artokun-comfyui-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "comfyui-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "artokun-comfyui-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "comfyui-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add artokun-comfyui-mcp -- npx -y comfyui-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "artokun-comfyui-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "comfyui-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add artokun-comfyui-mcp --command npx --arg -y --arg comfyui-mcp
# ~/.hermes/config.yaml
mcp_servers:
  artokun-comfyui-mcp:
    command: "npx"
    args: ["-y", "comfyui-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "artokun-comfyui-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "comfyui-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add artokun-comfyui-mcp -t stdio -c npx -a -y comfyui-mcp
// mcp.json
{
  "mcpServers": {
    "artokun-comfyui-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "comfyui-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 0
    • Security disclosure: unverified → fail functional
  • 19 Sept 26 0
    • Security disclosure: fail → unverified functional
  • 16 Sept 26 +12
    • Stability: fail → pass security
  • 14 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 16.

  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 6 to 9.

  • 10 Sept 26 0
    • Package version: 0.52.202 → 0.52.203 functional
  • 9 Sept 26 +13
    • Malware scan: unverified → pass security
  • 8 Sept 26 −15
    • Malware scan: pass → unverified security
    • Package version: 0.52.201 → 0.52.202 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed npm/comfyui-mcp@0.52.203

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo artokun/comfyui-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/artokun/comfyui-mcp/.github/workflows/release.yml@refs/tags/v0.52.203
Rekor log index 2776576344
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:ffca2b4695bc33f2fd382e99df59004f17069a54460af99eafb524ba9fe7fe16c269085b4512f2d22fadaaf2d646be0489313f1d721d90ea88daaf593

Background: How many MCP packages publish verified provenance →

Dependencies 216 packages
Packages resolved 216
Stale 33
No linked repository 8
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 41 exposed · ~42,843 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
runpod_watch ~470

Watch a RunPod pod's live status in the control panel, stop watching it, or diagnose why it isn't usable. Driven by the `action` parameter. None of these actions DEPLOYS or resumes a pod — the runpod tool does that. One of them CAN stop one, though: action:"watch" arms the idle auto-stop, so a watched pod whose ComfyUI sits idle past the configured timeout is stopped to save cost. Do not watch a pod that is deliberately idle but must stay up. - action:"watch" — Start broadcasting a pod's LIVE status to the control panel (desktop + mobile) — status, GPU/VRAM utilization, uptime, $/hr, and an idle-auto-stop countdown — refreshed every ~15s. runpod action:"connect" already starts this for the pod it connects to; call this to watch a pod WITHOUT retargeting comfyui-mcp at it (e.g. monitor a pod that's still booting). While watched, if the pod's ComfyUI sits idle past the configured timeout it is auto-stopped to save cost. - action:"unwatch" — Stop broadcasting a pod's live status to the control panel (does NOT stop the pod itself — use runpod action:"stop" for that). Also disables idle auto-stop for it. - action:"troubleshoot" — Diagnose why a RunPod pod isn't usable — call this when the pod 'won't connect', ComfyUI is unreachable, or a render can't reach the pod. Checks: does the pod exist, is it RUNNING (vs stopped/exited — then start it), is a GPU attached, is ComfyUI's port exposed as an HTTP proxy port, and does ComfyUI actually ANSWER at its proxy URL (probes /system_stats). Returns the specific blocker and the next step. Read-only.

NameTypeReqDescription
actionstringyesWhich watch operation to perform. "watch" and "troubleshoot" require `pod_id`; "unwatch" takes no other parameters (it clears whichever pod is currently watched).
pod_idstringThe RunPod pod ID. REQUIRED for actions "watch" and "troubleshoot". Ignored by "unwatch", which clears the single currently watched pod.

No output schema declared.

No examples provided.

save_workflow ~733

WRITE to the ComfyUI user library: persist a workflow, or capture/verify its provenance lock. This is the only tool here that writes — reading is get_workflow. Driven by the `action` parameter: - action:"save" — Save a workflow JSON to the connected ComfyUI server's user library so it appears in the ComfyUI web UI. Requires a running ComfyUI server; this writes to that server's userdata and OVERWRITES any existing file with the same filename without confirmation. Web-UI-format JSON ({ nodes: [], links: [] }) is saved as-is and is the preferred input — when re-saving an existing workflow, load it with get_workflow (action:"get", format='ui') and modify THAT. API-format graphs ({ '1': { class_type, inputs } }) are AUTO-CONVERTED to Web UI format with a generated layout so the saved file always opens in the ComfyUI canvas (the canvas cannot open raw API format). Returns a confirmation message (noting the conversion and any warnings), or the HTTP status and error text on failure. - action:"lock" — Capture a provenance lock for a saved workflow so it can be exactly reproduced later. Walks the workflow's model loaders (CheckpointLoaderSimple, UNETLoader, VAELoader, LoraLoader, ControlNetLoader, etc.), SHA-256s every referenced model file, records the git commit currently checked out for every custom node pack the workflow's class_types come from, and captures ComfyUI's reported version. WRITES `<filename>.lock.json` next to the workflow in ComfyUI's user library. Requires local filesystem access: models resolve from the data/model roots, and pack commits inspect custom_nodes on the live --base-directory / COMFYUI_PATH data root (not COMFYUI_CODE_PATH). Pair with action:"verify_lock" later to detect drift. - action:"verify_lock" — Compare a saved workflow's lock file against the current state of the local install and report drift. Loads `<filename>.lock.json`, re-computes a current lock from the same workflow, and diffs: which models have a different SHA-256, which custom…

NameTypeReqDescription
actionstringyesWhich write/provenance operation to perform. All three require `filename`; "save" also requires `workflow`.
filenamestringWorkflow filename in the ComfyUI user library (e.g. 'my_workflow.json'). REQUIRED for every action. A missing `.json` suffix is appended before use; extension case and forward-slash subfolders are pr…
workflowobjectaction:"save" (REQUIRED) — Workflow JSON to save. Web UI format ({ nodes: [], links: [] }) is stored verbatim; API format ({ '1': { class_type, inputs } }) is auto-converted to Web UI format (generat…

No output schema declared.

No examples provided.

search_custom_nodes ~426

Discover ComfyUI custom node PACKS in the public ComfyUI Registry (registry.comfy.org). Read-only and network-only: queries the hosted registry over HTTP and does NOT require a running ComfyUI or COMFYUI_PATH. This searches node PACKS, not models (use download_model action:"search") and not local installs (use list_local_models action:"list"). To actually install what you find, or to manage packs already installed, use install_custom_node. Driven by the `action` parameter: - action:"search" — Search by keyword; `query` required. Returns a ranked list of packs with id, name, author, install count, and latest version. The keyword search ranks a fixed window of packs client-side, so when it matches nothing the query is also tried as an exact registry id automatically (e.g. 'comfyui kjnodes' → 'comfyui-kjnodes'). Pass a returned id to action:"details" for full info, or to install_custom_node (action:"install"). - action:"details" — Full details for ONE pack by its exact registry id: description, author, license, repository, install count, latest version, the node types it provides, and recent version changelogs. Look up the id via action:"search" first.

NameTypeReqDescription
actionstringyesWhich registry lookup to perform. "search" requires `query` (and takes optional `limit`/`page`); "details" requires `id`.
idstringaction:"details" — REQUIRED. Exact registry pack id (the 'id' field from action:"search"), e.g. 'comfyui-impact-pack'.
limitintegeraction:"search" — max results to return (default 10).
pageintegeraction:"search" — page number for pagination (default 1).
querystringaction:"search" — REQUIRED. Keyword(s) to match against pack name/description, e.g. 'impact', 'controlnet aux'.

No output schema declared.

No examples provided.

train_doctor ~487

Preflight and set up the TRAINER ITSELF — the docker/GPU/venv machinery every training job needs. Touches no dataset and no job. Driven by the `action` parameter: - action:"doctor" — Preflight the local trainer: docker daemon reachable, `--gpus all` GPU passthrough working (NVIDIA Container Toolkit), trainer image built. Read-only, takes no other parameters. Returns per-check booleans + setup hints. Also reports the training data root and whether HF_TOKEN is set (needed to download FLUX.1-dev on first run), the native (dockerless) bootstrap status, and the connected pod. Run this first when a training start fails. - action:"bootstrap" — Set up the NATIVE (dockerless) trainer on this machine (`target` 'local', the default) or on a pod (`target` 'pod', optional `pod_id`): clone ai-toolkit at the pinned commit, create its venv, install torch + requirements. One-time per machine/pod (~10 min fresh, idempotent; a pod's /workspace persists it across restarts). Needed before a target 'pod' train_start on a fresh pod (no docker there). Long-running. - action:"build_image" — Build the headless GPU trainer image (comfyui-mcp-trainer:latest) from docker/trainer/Dockerfile — one-time, several minutes (CUDA + torch + ai-toolkit). Requires a reachable docker daemon. `aiToolkitRef` pins the ai-toolkit commit/tag for reproducibility. The docker alternative to action:"bootstrap".

NameTypeReqDescription
actionstringyesWhich trainer-setup operation to perform. "doctor" is read-only and takes no other parameters; "bootstrap" takes `target` (+ `pod_id` for target 'pod'); "build_image" takes an optional `aiToolkitRef`…
aiToolkitRefstringaction:"build_image" — ai-toolkit git ref (commit/tag) to build against. Default: the Dockerfile's pinned ref.
pod_idstringaction:"bootstrap" — pod to bootstrap (target 'pod'). Default: the connected pod.
targetstringaction:"bootstrap" — where to install the native trainer. Default local.

No output schema declared.

No examples provided.

train_prepare_dataset ~1,189

Stage and curate the training DATASETS a LoRA run consumes — the images and their captions. Datasets are keyed by `name`; the jobs that train on them live in the separate `train_start` tool and are keyed by `id`. Driven by the `action` parameter: - action:"prepare" — Stage training images + captions into a dataset dir the trainer consumes. Each item is an image (absolute `path`, OR a ComfyUI `ref` {filename,subfolder?,type?} resolved against the connected ComfyUI's output/input dirs — how phone/panel pickers hand over selections) with an optional caption (a missing caption falls back to defaultCaption — typically the trigger word). Requires `name` + `items`. Returns the datasetPath to pass to train_start (action:"start"). Character LoRA guidance: 10-30 varied images; caption what changes between images, keep the trigger word constant. - action:"list" — List staged datasets, newest-first, with image/caption counts. Read-only, takes no other parameters. Pair with action:"detail" to see one dataset's images + captions. - action:"detail" — Show ONE staged dataset by `name`: its dir (datasetPath — reusable as train_start's datasetPath) and every image with its caption (null when uncaptioned). Images render via action:"file". Read-only. - action:"update" — Edit a staged dataset by `name`: set/replace per-image captions (`setCaptions`) and/or delete individual images with their caption files (`deleteImages`). Refuses while a running/queued job trains from it. Returns per-file warnings for unknown files. This is the SURGICAL edit — it removes only the filenames you list, leaving the dataset itself in place. - action:"delete" — DESTROY a whole staged DATASET by `name`: every image and every caption under it. Irreversible, and the images are typically hand-curated and unrecoverable — confirm with the user first. Refuses while a running/queued job trains from it. THIS DELETES A DATASET, NOT A TRAINING JOB: to delete a finished job's record and checkpoints use the separate `tr…

NameTypeReqDescription
actionstringyesWhich dataset operation to perform. "list" takes no other parameters; "prepare" requires `name` + `items`; "detail", "update", "delete" and "caption_dataset" require `name`; "file" and "caption_image…
defaultCaptionstringaction:"prepare" — fallback caption for items without one; usually the trigger word.
deleteImagesarrayaction:"update" — image filenames to delete from the dataset (caption files go too). Removes only these files; action:"delete" removes the whole dataset.
guidestringactions "caption_image"/"caption_dataset" — extra style guidance for the captioner (e.g. 'focus on outfits and backgrounds').
itemsarrayaction:"prepare" — the images to stage. REQUIRED for that action.
namestringDataset name — the staging dir name. REQUIRED for actions "prepare" (it is created), "detail", "update", "delete" and "caption_dataset" (from action:"list"). This is a DATASET name, never a training…
onlyarrayaction:"caption_dataset" — subset of filenames to caption (default: all images).
pathstringAbsolute path of a file under the training root. REQUIRED for action:"file" (a dataset image or job sample, from action:"detail"'s datasetPath or train_start action:"status"'s samples) and for action…
setCaptionsobjectaction:"update" — {filename: caption} pairs to write (replaces existing captions).
triggerstringactions "caption_image"/"caption_dataset" — trigger word to prepend to the caption(s).

No output schema declared.

No examples provided.

train_start ~1,309

Run and inspect LoRA training JOBS — launch a run, poll it, stop it, delete it, and read back the settings behind it. Jobs are keyed by `id`; the datasets they train on live in the separate `train_prepare_dataset` tool and are keyed by `name`. Driven by the `action` parameter: - action:"start" — Start a LoRA training job: target 'local' builds the config and launches the GPU trainer container (docker run --gpus all); target 'pod' ssh-drives pod-native training on a connected RunPod pod (pod_id, or the connector's currently connected pod). Requires `name` + `datasetPath`. Returns a job id for action:"status"/action:"cancel". Long-running — returns immediately; poll action:"status". On completion the LoRA is delivered per deliverTo (pod/local/both) and cataloged when local. Run train_doctor first if unsure the image/docker/GPU (local) or bootstrap (pod) are ready. - action:"status" — Check training progress: pass an `id` for one job (step/total, loss, recent samples, log tail, result paths when done) or OMIT `id` for all jobs newest-first. Read-only. - action:"cancel" — STOP a RUNNING job (docker stop) by `id` and mark it cancelled. Nothing is erased: checkpoints already saved stay in the job's output dir; no LoRA is handed off to models/loras, so the run can be inspected afterwards. Returns ok:false when the container could not be confirmed stopped (the job reverts to running). This is the RECOVERABLE stop — use action:"delete" only when you also want the artifacts gone. - action:"delete" — DESTROY a finished job by `id`: its record AND its output dir with checkpoints/samples, unless keep_outputs is true. Irreversible — confirm with the user first. The delivered LoRA in models/loras is NOT removed. Running/queued jobs must be cancelled first (action:"cancel"). THIS DELETES A JOB, NOT A DATASET: to delete the staged images and captions a run consumed use the separate `train_prepare_dataset` tool with action:"delete", which is keyed by `name` rather than `id`. - actio…

NameTypeReqDescription
actionstringyesWhich training-job operation to perform. "list_flows" takes no other parameters; "status" takes an OPTIONAL `id` (omit for all jobs); "cancel", "delete" and "job_config" require `id`; "start" and "pr…
datasetPathstringDataset dir from train_prepare_dataset (images + same-basename .txt captions). REQUIRED for actions "start" and "preview_config".
deliverTostringaction:"start", pod jobs only: where the finished LoRA lands.
devicestringaction:"start" — GPU selector, default cuda:0.
flowstringaction:"start" — training flow (see action:"list_flows").
idstringTraining job id, as returned by action:"start" (e.g. "t8f3k2ab") — NEVER a dataset name. REQUIRED and must be non-empty for actions "cancel", "delete" and "job_config". OPTIONAL for action:"status":…
keep_outputsbooleanaction:"delete" — keep the job's output dir (checkpoints/samples) and delete only the record.
modelstringaction:"start" — base model (see action:"list_flows").
model_pathstringaction:"start" — override the base model path AS THE TRAINER SEES IT (pod path for target 'pod', container path for 'local') — e.g. a pre-uploaded local HF snapshot dir when the default HF repo id is…
namestringJob name — becomes the output .safetensors basename (e.g. 'aria_character'). REQUIRED for actions "start" and "preview_config". This names the RUN, not the dataset it reads.
paramsobjectTraining param overrides for actions "start" and "preview_config" (steps/lr/rank/resolution/batchSize/saveEvery/sampleEvery/quantize). Omitted keys fall back to the defaults from action:"list_flows".…
pod_idstringaction:"start" — RunPod pod to train on (target 'pod'). Default: the connector's currently connected/watched pod.
targetstringaction:"start" — 'local' = docker on this rig; 'pod' = pod-native over ssh on a RunPod pod.
triggerstringUnique trigger word (e.g. 'ohwx person') — injected as trigger_word and usable in prompts.

No output schema declared.

No examples provided.

upload_image ~1,087

Put a file where ComfyUI (or cloud storage) can read it. Driven by the `action` parameter: - action:"image" — Upload a local image file to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint so it can be referenced in LoadImage nodes. Works for both local and remote ComfyUI. Nested filenames that LoadImage does not enumerate are re-registered at the input root; the returned filename is the one a LoadImage combo can select. - action:"video" — Upload a local video file (.mp4, .mov, .webm, .avi, .mkv, .m4v) to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint for use in video-loading nodes such as VHS_LoadVideo (ComfyUI-VideoHelperSuite). Works for both local and remote ComfyUI. Returns the stored filename. - action:"audio" — Upload a local audio file (.wav, .mp3, .flac, .ogg, .m4a, .aac) to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint for use in audio-conditioned workflows (e.g. LoadAudio). Works for both local and remote ComfyUI. Returns the stored filename. - action:"stage" — Stage an EXISTING ComfyUI output (or temp/preview) as an INPUT so the next stage's loader (LoadImage / VHS_LoadVideo / LoadAudio) can read it. This is the CORRECT way to chain a multi-stage pipeline (e.g. Krea2 image → LTX video → WAN extend): it fetches the output's bytes from the server via /view and re-registers them as an input via /upload/image — the same endpoints get_image and the uploads above use. Because it goes entirely through the server API, it works even when ComfyUI was launched with a CUSTOM input/output directory. Do NOT instead copy the output file or guess a filesystem `input/` path — the server's input dir may be custom and it will reject the file ("Invalid image file"), wasting the render. Pass an existing output reference ({ filename, subfolder?, type? }); the media kind (image/video/audio) is inferred from the extension unless you set `kind`. Nested video as_filename values are staged at…

NameTypeReqDescription
actionstringyesWhat to upload and where. "image"/"video"/"audio" send a LOCAL file (`source_path`) to ComfyUI's input/ directory; "stage" re-registers an EXISTING server-side output (`filename`) as an input; "outpu…
as_filenamestringaction:"stage" — override the filename it is registered under in the input/ directory (defaults to the source filename).
asset_idstringaction:"output" — registered asset id from a completed job. Provide exactly one of asset_id or path.
destinationobjectaction:"output" — REQUIRED. Exactly one upload destination.
filenamestringTwo meanings, one per action. actions "image"/"video"/"audio" — OPTIONAL override for the filename in ComfyUI's input/ directory (auto-detected from source_path if omitted). A path prefix (e.g. asset…
kindstringaction:"stage" — force the media kind instead of inferring it from the file extension.
pathstringaction:"output" — path to a generated output under COMFYUI_PATH/output. Provide exactly one of asset_id or path.
source_pathstringAbsolute path to the local file to upload. REQUIRED for actions "image", "video" and "audio".
subfolderstringaction:"stage" — subfolder the source asset currently lives in, if any.
typestringaction:"stage" — source directory the asset lives in: output (default) or temp (previews).

No output schema declared.

No examples provided.

visualize_workflow ~664

DRAW a diagram of, or convert, workflow JSON you PASS IN (a JSON string or object) — it does NOT read the user's live canvas, so for 'show me what's on the canvas' / the CURRENTLY-OPEN graph use panel_graph_outline instead. Driven by the `action` parameter: - action:"render" — Mermaid flowchart of the whole graph: nodes grouped by category, connections labeled by data type. - action:"render_hierarchical" — the same graph SECTIONED rather than flat, which is what you want past ~20 nodes. `view` picks a compact overview, one section in detail, a text listing, or an AI-oriented structured summary. - action:"mermaid" — the INVERSE of render: a Mermaid flowchart back into executable API-format workflow JSON, wired from /object_info schemas. - action:"to_dsl" — API-format JSON into the compact, human/LLM-readable authoring DSL: `key <- nodeId.outputIndex` for connections, `key = <JSON>` for literals. Round-trips losslessly. (Experimental.) - action:"from_dsl" — that DSL back into executable JSON, plus advisory wiring warnings when ComfyUI is reachable (the conversion succeeds either way). (Experimental.)

NameTypeReqDescription
actionstringyesWhich rendering/conversion to perform. "render", "render_hierarchical" and "to_dsl" require `workflow`; "mermaid" requires `mermaid`; "from_dsl" requires `dsl`.
directionstringaction:"render" / action:"render_hierarchical" — Flowchart direction: LR (left-to-right) or TB (top-to-bottom). Default LR for "render" and for the hierarchical detail view, TB for the hierarchical o…
dslstringaction:"from_dsl" (REQUIRED) — Workflow DSL text
mermaidstringaction:"mermaid" (REQUIRED) — Mermaid flowchart text (with or without ```mermaid code fence). Nodes should use ComfyUI class_type names as labels. Connections should be labeled with data types (e.g.,…
sectionstringaction:"render_hierarchical" — Section name to show in detail view (required when view=detail). Use view=list to see available section names.
show_valuesbooleanaction:"render" / action:"render_hierarchical" — Include widget values (seed, steps, cfg, etc.) in node labels (detail view only, for the hierarchical action).
viewstringaction:"render_hierarchical" — overview: compact diagram with sections as summary nodes; detail: full diagram for one section; list: text summary of all sections; summary: structured text optimized f…
workflowComfyUI workflow JSON (as a JSON string or object; API or UI format is auto-detected). REQUIRED for action:"render", action:"render_hierarchical" and action:"to_dsl" — "to_dsl" expects API format (no…

No output schema declared.

No examples provided.

workspace ~294

Inspect and manage ComfyUI workspaces (local installs). Driven by the `action` parameter: - action:"get" — Report the active ComfyUI workspace (mirrors `comfy-cli which`): the local installation path being used (from COMFYUI_PATH or auto-detection), the source of that path, any persisted default workspace, and the resolved API target the MCP server talks to. - action:"set_default" — Persist a default ComfyUI workspace path to the MCP config file (mirrors `comfy-cli set-default`). The value is stored under the OS config dir (e.g. ~/.config/comfyui-mcp/workspace.json) and reported by action:"get"/action:"list". Does NOT change the live API target. `path` is REQUIRED, e.g. {action:"set_default", path:"/opt/ComfyUI"}. - action:"list" — List known/auto-detected ComfyUI installations on this machine. Scans common install locations across macOS, Linux, and Windows and marks which one is active and which is the saved default.

NameTypeReqDescription
actionstringyesWhich workspace operation to perform. "get" and "list" take no other parameters; "set_default" requires `path`.
pathstringaction:"set_default" — REQUIRED absolute path to a ComfyUI installation directory to remember as the default workspace.

No output schema declared.

No examples provided.

Common questions

What is the io.github.artokun/comfyui-mcp server?

io.github.artokun/comfyui-mcp is listed in the public MCP registry as io.github.artokun/comfyui-mcp. MCP server + Claude Code plugin for ComfyUI: run workflows, generate images, manage models & VRAM. This page covers its npm package (comfyui-mcp).

Is the io.github.artokun/comfyui-mcp server safe to use?

io.github.artokun/comfyui-mcp scores 91 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.artokun/comfyui-mcp server expose?

io.github.artokun/comfyui-mcp exposes 41 tools: comfy_cli, enqueue_workflow, get_system_stats, visualize_workflow, create_workflow, and 36 more. Their descriptions and schemas cost roughly 42,843 tokens of context every time the server is loaded.

Is the io.github.artokun/comfyui-mcp server still maintained?

io.github.artokun/comfyui-mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.artokun/comfyui-mcp server under?

io.github.artokun/comfyui-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.