Skip to main content
Glama

save_workflow

Persist a ComfyUI workflow to the user library, capture a provenance lock with model hashes and commit info, or verify drift before re-running.

Instructions

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 node packs are on a different commit, whether ComfyUI's version changed. Use before re-running an important workflow days or weeks later to confirm it'll behave the same. Supports split local installs (models and packs stay on the data/base root). Read-only; returns a structured drift report (empty arrays everywhere mean perfect parity).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYesWhich write/provenance operation to perform. All three require `filename`; "save" also requires `workflow`.
filenameNoWorkflow 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 preserved. The name must be a safe relative path. For action:"save" this OVERWRITES an existing file of the same canonical name; for "lock"/"verify_lock" the lock is read/written as '<filename>.lock.json' alongside it.
workflowNoaction:"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 (generated layout) so it stays openable in ComfyUI's canvas. Not validated against the server before saving.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.0.0

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and meets it: it discloses that save OVERWRITES without confirmation, requires a running ComfyUI server, does not validate against the server, auto-converts API format and returns a confirmation noting conversion/warnings, and returns HTTP status plus error text on failure. lock/verify_lock disclose local filesystem requirements, which roots are inspected, and that verify_lock is read-only.

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?

Front-loads the single most important fact (only writing tool) before the action breakdown, and the bulleted structure makes scanning per-action behavior easy. It is verbose, with some detail that partially duplicates the schema, but every sentence carries operational weight.

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?

No output schema exists, and the description compensates by stating what each action returns (confirmation message with warnings, HTTP status/error text, structured drift report with empty arrays meaning parity). For a three-mode tool with a nested workflow object, nothing an agent needs to call it correctly is missing.

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 coverage is already 100%, so baseline is 3; the description adds real value by mapping each action to its required params and explaining consequences tied to them (filename canonicalization, lock file naming '<filename>.lock.json', overwrite behavior). It stops short of adding type-level or edge-case detail beyond that.

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?

Opens with an explicit verb+resource ('WRITE to the ComfyUI user library') and immediately distinguishes itself from the sibling read path ('This is the only tool here that writes — reading is get_workflow'). Each of the three action modes is then named and scoped with a concrete object (workflow JSON, lock file, drift report).

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?

Gives per-action when-to-use guidance, including the temporal condition for verify_lock ('before re-running an important workflow days or weeks later'), the pairing instruction ('Pair with action:"verify_lock" later to detect drift'), and the format guidance for re-saving ('load it with get_workflow (action:"get", format='ui')'). Alternatives are named explicitly rather than inferred.

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