download_model
Fetch model weights into ComfyUI's models folder from URLs, HuggingFace, or CivitAI; search for models, track download progress, and cancel transfers.
Instructions
Find model weights and get them onto the connected ComfyUI, and track the transfers. Driven by the action parameter:
action:"download" — Download a model file to the connected ComfyUI's models directory from a URL (HuggingFace, direct HTTP(S), s3://, or Azure Blob). Requires
url+target_subfolder. PREFER this over a raw shell download (curl/wget) for model weights: it lands the file in the right models/ subfolder. LOCAL ComfyUI: streams to disk and surfaces live progress in the panel download tray. REMOTE ComfyUI: dispatches the fetch to the ComfyUI host via the ComfyUI-Manager install-model HTTP API (downloaded server-side; a per-requestauthheader can't be forwarded). This requires the host's Manager to run with network_mode=personal_cloud (or loopback) and a permissive security level — a stricter gate silently rejects the download, and Manager reports the queue task 'done' even on failure, so a remote dispatch does not guarantee the file landed. target_subfolder accepts any relative subfolder (incl. nested, e.g. 'loras/').action:"status" — Check on downloads started by action:"download" / action:"download_civitai". Reports each download's state (downloading / done / error / cancelled), its destination path once it lands, and byte progress when the panel progress channel is enabled. Use this after a download reports it is still running — that means the transfer is in flight, NOT that it failed. Across an AGENT/sidebar session reconnect a download this MCP streams locally keeps running and is normally resolvable by
idor byurl. An ORCHESTRATOR RESTART is different: a record carried across one reports only that this MCP STOPPED WATCHING — not that the bytes stopped, which it does not check. READ THE NOTE ON THAT RECORD before acting: it distinguishes a local stream (nothing is writing it; re-issue) from a ComfyUI-Manager dispatch (the fetch runs on the ComfyUI host, which a restart here does not touch, so re-issuing writes a second copy to the same destination and CORRUPTS the model). And NOT FOUND NEVER MEANS STOPPED: both the cross-session record and the carry-over are written best-effort, so their absence is evidence of nothing. Omitidandurlto list every tracked download. A previous session's download whose heartbeat has gone stale is reported with a stale-heartbeat NOTE: action:"cancel" can close it once the writer is proven gone. WHAT COMES AFTER THAT CANCEL DEPENDS ON THE ROUTE, and the note says which — for a local stream re-issuing resumes the .partial or restarts cleanly, but for a ComfyUI-Manager dispatch there is no local .partial and the host may still be fetching, so re-issuing is a duplicate dispatch that CORRUPTS the file. An older record that predates the route being stored says the route is UNKNOWN and tells you to verify the file before re-issuing, rather than guessing either way. Read-only.action:"cancel" — Cancel ONE in-flight download by its
id(from action:"status" or from the download that started it) — REQUIRED, and it must be the id of the download you mean, since a wrong id stops someone else's transfer. Aborts only that download's transfer; other downloads keep running. An id that names no tracked download is reported as such, not silently treated as success. The partially-downloaded bytes are left on disk as a resumable .partial and are NEVER reported as a completed file, so nothing corrupt lands in your models directory; re-issuing the same download later resumes where it left off. Idempotent: cancelling an already-finished, failed, or already-cancelled download just reports its current state. A download whose AbortController lives in ANOTHER live session cannot be aborted from here (stop it from the panel download tray) — but a download left 'downloading' by a session that is PROVEN gone (heartbeat stale AND its process no longer exists) CAN be cancelled from here: the stale record is closed as cancelled, after which re-issuing action:"download" resumes the leftover .partial or restarts cleanly. While the writer cannot be proven gone, the cancel refuses rather than risk two writers on one file. NOTE: for a download dispatched to a REMOTE ComfyUI via ComfyUI-Manager (server-side fetch), the local job is marked cancelled but the host may keep fetching — there is no Manager API to stop it.action:"search" — Search HuggingFace Hub for models usable in ComfyUI (checkpoints, LoRAs, VAEs, ControlNets, etc.);
queryis required. Read-only and network-only: queries HuggingFace over HTTP, does NOT require a running ComfyUI or COMFYUI_PATH and does not download anything. Returns a ranked list with modelId, author, downloads, likes, and tags. Pick a result's download URL and pass it to action:"download". For CIVITAI searches ('find a Flux LoRA on Civitai') use action:"search_civitai" instead — it filters by type + base model and returns ids for action:"download_civitai". For packs of custom nodes (not models) use search_custom_nodes.action:"search_civitai" — Search CivitAI by keyword for checkpoints, LoRAs, embeddings, VAEs, and ControlNets — THE action for 'find me a LoRA on Civitai'. Read-only and network-only (public CivitAI REST API; no token or running ComfyUI required; CIVITAI_API_TOKEN unlocks gated results). Filter by
types(LORA, Checkpoint, TextualInversion, VAE, Controlnet, …) andbase_models(CivitAI labels: 'Flux.1 D', 'SDXL 1.0', 'SD 1.5', 'Pony', 'Illustrious', 'Wan Video') — ALWAYS pass base_models when the user's checkpoint family is known, so results actually fit their setup. Each hit returns the model_id and version_id that action:"download_civitai" takes directly, plus trigger words to use in the prompt after installing. Flow: action:"search_civitai" → pick a hit → action:"download_civitai" {model_version_id, target_subfolder} → wire/prompt with the trained words. Passcreator(exact username, e.g. from action:"search_creators") to list ONE creator's models — with or without aquery; at least one of the two is required. SFW-only by default. For HuggingFace search use action:"search".action:"search_creators" — Find CivitAI CREATORS — THE action for 'who are the top creators on Civitai' and 'find creator '. Read-only and network-only (no token or running ComfyUI required). Two modes: with NO
queryit returns the site's creator LEADERBOARD (civitai.com/leaderboard — rank, score, downloads, likes; pick aboard: 'overall' [default], 'overall_90' [last 90 days], 'overall_nsfw' [mature], 'new_creators' [first model <30 days ago]); with aqueryit searches usernames (public /api/v1/creators; partial match, returns model counts, NOT ranked). Each hit's username feeds action:"search_civitai" {creator: } directly. SCOPE CAVEAT: the /api/v1/creators index only lists creators who have published MODELS. A creator who posts only images/videos (no models) legitimately returns 0 hits here — that is a gap in this endpoint, NOT proof the creator doesn't exist. For a media-only creator, browse their images via the panel CivitAI browser (panel_open_civitai {creator}) or the logged-in browser session instead.action:"download_civitai" — Download a model from CivitAI into the connected ComfyUI's models/ directory. Requires
target_subfolderplus at least one ofmodel_id/model_version_id. Resolves a CivitAI model id (latest version) or a model-version id to a download URL via the CivitAI REST API. LOCAL ComfyUI (COMFYUI_PATH set): streams the file to disk under /models// and returns the saved absolute path. REMOTE ComfyUI: dispatches the download to the ComfyUI host via the ComfyUI-Manager install-model HTTP API (fetched server-side). Gated/early-access models require CIVITAI_API_TOKEN locally (sent as a bearer header, never in the URL); remote Manager-side fetches rely on tokens configured on the ComfyUI host. NOTE (remote): the server-side install requires the host's ComfyUI-Manager to run with network_mode=personal_cloud (or loopback) and a permissive security level; a stricter gate silently rejects the download, and Manager reports the queue task 'done' even on failure — so a remote dispatch does not guarantee the file landed.action:"resolve_missing" — Find the model files a
workflowneeds but this ComfyUI does NOT have, and search CivitAI + HuggingFace for installable candidates. THE action for 'this Template says a model is missing — go get it'. Detects by comparing each model widget against the option list the server actually publishes, so it covers checkpoints, LoRAs, VAEs, ControlNets, UNets, CLIP and custom-pack model types without any per-node mapping. Each candidate reports size, source, precision/quantisation (fp16 / fp8 / GGUF Q4_K_M …) and whether it FITS this GPU's VRAM — so when the exact file is too big you can see the quantised variant that isn't. Read-only: it downloads nothing. Pass a chosen candidate to action:"download" (url) or action:"download_civitai" (id), using the reported directory as target_subfolder. For missing custom NODE PACKS (not models) use list_packs (action:"install_deps") instead.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The download id. REQUIRED for action:"cancel" — this is the handle that says WHICH transfer to stop, so take it from action:"status" (or from the reply that started the download) rather than guessing; an id that matches nothing is reported as not found. OPTIONAL for action:"status" — omit to list every tracked download (incl. in-flight ones from before a reconnect). | |
| url | No | REQUIRED for action:"download" — the direct download URL for the model file. OPTIONAL for action:"status" — adopt an in-flight download by its source URL when you don't have the id (e.g. after a reconnect); reports the matching job without starting a duplicate. | |
| auth | No | action:"download" — optional per-request authentication for private/gated model URLs. When provided it overrides built-in HuggingFace/CivitAI token handling. | |
| nsfw | No | action:"search_civitai" — include NSFW results (default false). | |
| sort | No | action:"search_civitai" — ranking (default 'Highest Rated'). | |
| board | No | action:"search_creators" — leaderboard to rank by when no query is given (default 'overall'). Ignored with a query. | |
| limit | No | Max results (default 10, or 8 candidates per missing model for action:"resolve_missing"). Per-action ceilings, unchanged from the tools this folds in: "search" 50, "search_civitai" 25, "search_creators" 50, "resolve_missing" 20. | |
| query | No | REQUIRED for action:"search" — the HuggingFace search query (e.g. 'SDXL', 'flux', 'controlnet'). action:"search_civitai" — keyword search (e.g. 'detail enhancer', a character name); optional when `creator` is given (then it narrows that creator's models). action:"search_creators" — username search (partial match, e.g. 'alcait'); omit to get the top-creators leaderboard instead. | |
| types | No | action:"search_civitai" — only these model types (e.g. ['LORA']). | |
| action | Yes | Which model operation to perform. "download" requires `url` + `target_subfolder`; "status" takes an optional `id`/`tray_id`/`url` (omit all three to list everything); "cancel" requires `id` (optional `tray_id`); "search" requires `query`; "search_civitai" requires `query` and/or `creator`; "search_creators" takes an optional `query` (omit for the leaderboard `board`); "download_civitai" requires `target_subfolder` plus `model_id` and/or `model_version_id`; "resolve_missing" requires `workflow`. | |
| filter | No | action:"search" — optional HuggingFace pipeline/library tag to narrow results, e.g. 'diffusers' or 'text-to-image'. | |
| creator | No | action:"search_civitai" — only models by this CivitAI creator (EXACT username — find it with action:"search_creators"). At least one of query/creator is required. | |
| tray_id | No | action:"status" / action:"cancel" — use this when two rows come back with the SAME `id`, so the id alone cannot say which one you mean. That happens when two different source URLs are downloading to the same destination file. Every row prints its own tray id as `(tray <tray_id>)` — pass that here, together with `id`, to report on (or stop) exactly one of them. | |
| filename | No | action:"download" — override filename (auto-detected from the URL if omitted). action:"download_civitai" — override the saved filename (defaults to the CivitAI file name, or the URL basename). | |
| model_id | No | action:"download_civitai" — CivitAI model id. The latest version is used unless model_version_id is also provided. | |
| workflow | No | REQUIRED for action:"resolve_missing" — the ComfyUI workflow in API format (JSON string or object). | |
| base_models | No | action:"search_civitai" — only these base-model families, CivitAI labels: 'Flux.1 D', 'SDXL 1.0', 'SD 1.5', 'Pony', 'Illustrious', 'Wan Video', … | |
| model_version_id | No | action:"download_civitai" — CivitAI model-version id (from the URL ?modelVersionId=...). If both model_id and model_version_id are given, this selects the specific version of that model. | |
| target_subfolder | No | REQUIRED for action:"download" and action:"download_civitai". Target subfolder under ComfyUI models/. Standard names: checkpoints, loras, vae, upscale_models, controlnet, embeddings, clip, diffusers, diffusion_models, gligen, hypernetworks, photomaker, style_models, text_encoders, unet. Any other relative subfolder (incl. nested like 'loras/<subdir>') is allowed; absolute paths and '..' escapes are rejected. |