New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

Authoring & Publishing ComfyUI Custom Nodes

by artokun · MIT license · ★ 759 on GitHub · updated Sep 21

Authoring & Publishing ComfyUI Custom Nodes cover

Authoring & publishing ComfyUI custom nodes to the Comfy Registry, covering node structure, pyproject.toml spec, comfy-cli publishing, and CI

---
name: comfyui-node-registry
description: Authoring & publishing ComfyUI custom nodes to the Comfy Registry, covering node structure, pyproject.toml spec, comfy-cli publishing, and CI
---

# Authoring & Publishing ComfyUI Custom Nodes

This skill covers writing a ComfyUI custom node pack and publishing it to the Comfy Registry (registry.comfy.org), the public catalog that powers ComfyUI-Manager. For *using* existing nodes in workflows, see the `comfyui-core` skill instead.

## Minimal Node Pack Structure

A node pack is a Python package placed under `ComfyUI/custom_nodes/<name>/`. The package `__init__.py` must export `NODE_CLASS_MAPPINGS` and `NODE_DISPLAY_NAME_MAPPINGS`; `WEB_DIRECTORY` is optional (only if the pack ships frontend JS).

```
ComfyUI/custom_nodes/my-node-pack/
├── __init__.py          # exports the mappings ComfyUI scans for
├── nodes.py             # node class definitions
├── pyproject.toml       # registry metadata (required to publish)

Overview

This skill covers writing a ComfyUI custom node pack and publishing it to the Comfy Registry (registry.comfy.org), the public catalog that powers ComfyUI-Manager. For using existing nodes in workflows, see the comfyui-core skill instead.

Manual install (npx, ZIP)
Claude Codenpx skills add artokun/comfyui-mcp --skill comfyui-node-registry -g -a claude-code
Claude Code (manual)mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/artokun/comfyui-mcp/tar.gz/1d5b12b1b499 \ | tar -xz -C ~/.claude/skills --strip-components=3 comfyui-mcp-1d5b12b1b499/plugin/skills/comfyui-node-registry
Windows (PowerShell)New-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/f1f581b1f8178d7dcea3/comfyui-node-registry.zip" -OutFile "$env:TEMP\comfyui-node-registry.zip"; Expand-Archive "$env:TEMP\comfyui-node-registry.zip" -DestinationPath "$HOME\.claude\skills" -Force
Claude.ai / desktopDownload the ZIP and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md11.3 KB
  • references/1 file · 2.5 KB
Read the files here
artokun/1d5b12b2 files
SKILL.md
Show the full text224 lines

Authoring & Publishing ComfyUI Custom Nodes

This skill covers writing a ComfyUI custom node pack and publishing it to the Comfy Registry (registry.comfy.org), the public catalog that powers ComfyUI-Manager. For using existing nodes in workflows, see the comfyui-core skill instead.

Minimal Node Pack Structure

A node pack is a Python package placed under ComfyUI/custom_nodes/<name>/. The package __init__.py must export NODE_CLASS_MAPPINGS and NODE_DISPLAY_NAME_MAPPINGS; WEB_DIRECTORY is optional (only if the pack ships frontend JS).

ComfyUI/custom_nodes/my-node-pack/
├── __init__.py          # exports the mappings ComfyUI scans for
├── nodes.py             # node class definitions
├── pyproject.toml       # registry metadata (required to publish)
├── requirements.txt     # optional Python deps
├── .comfyignore         # optional — exclude files from the published archive
├── LICENSE
├── README.md
└── web/js/              # optional frontend extension (see WEB_DIRECTORY)
__init__.py
from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS

# Optional: serve frontend JS/CSS from this folder (path relative to __init__.py)
WEB_DIRECTORY = "./web/js"

__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
A minimal node class (nodes.py)
class ImageSelector:
    CATEGORY = "example"          # menu path where the node appears

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "images": ("IMAGE",),
                "mode": (["brightest", "reddest", "greenest", "bluest"],),
            },
            "optional": {
                "threshold": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}),
                "count": ("INT", {"default": 1, "min": 1, "max": 64}),
                "label": ("STRING", {"default": "", "multiline": False}),
            },
        }

    RETURN_TYPES = ("IMAGE",)        # tuple of output data types
    RETURN_NAMES = ("image",)        # optional friendly output names
    FUNCTION = "choose_image"        # name of the method ComfyUI calls
    OUTPUT_NODE = False              # True for terminal nodes (e.g. SaveImage)

    def choose_image(self, images, mode, threshold=0.5, count=1, label=""):
        import torch
        brightness = [torch.mean(img.flatten()).item() for img in images]
        best = brightness.index(max(brightness))
        return (images[best].unsqueeze(0),)   # MUST return a tuple


NODE_CLASS_MAPPINGS = {
    "ImageSelector": ImageSelector,        # globally unique class_type key
}

NODE_DISPLAY_NAME_MAPPINGS = {
    "ImageSelector": "Image Selector",     # label shown in the UI
}
Node class contract
Member Required Purpose
INPUT_TYPES yes @classmethod returning {"required": {...}, "optional": {...}}. Each input is (TYPE,) or (TYPE, {opts}).
RETURN_TYPES yes Tuple of output type strings (e.g. ("IMAGE", "MASK")). Single output still needs a trailing comma.
FUNCTION yes String name of the method to execute.
CATEGORY yes Menu path string for the Add Node menu.
RETURN_NAMES no Friendly names for outputs (defaults to lowercased types).
OUTPUT_NODE no True marks a terminal node that produces a result (save/preview).

The options dict drives the UI widget for each input type:

  • ("INT", {"default": 0, "min": 0, "max": 100, "step": 1})
  • ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.1})
  • ("STRING", {"default": "", "multiline": True})
  • (["a", "b", "c"],), a literal list, becomes a dropdown
  • ("IMAGE",), ("LATENT",), ("MODEL",) etc. are typed connections (no widget)

The executing method must return a tuple matching RETURN_TYPES, even for a single output (return (result,)).

pyproject.toml — Registry Metadata

Required to publish. comfy node init scaffolds this file. See references/pyproject.toml for a fully-commented example.

[project]
name = "my-node-pack"                          # unique & IMMUTABLE; lowercase, <100 chars, no "ComfyUI" prefix
description = "What this node pack does"
version = "1.0.0"                              # semantic version X.Y.Z — bump to publish a new version
license = { file = "LICENSE" }                 # or { text = "MIT License" }
requires-python = ">=3.10"
dependencies = [
    "comfyui-frontend-package<=1.21.6",        # optional — pin frontend if you ship UI
]
classifiers = [
    "Operating System :: OS Independent",
]

[project.urls]
Repository = "https://github.com/you/my-node-pack"   # REQUIRED — must be a valid repo URL
Documentation = "https://github.com/you/my-node-pack/wiki"
"Bug Tracker" = "https://github.com/you/my-node-pack/issues"

[tool.comfy]
PublisherId = "your-publisher-id"              # the id after @ on your registry profile
DisplayName = "My Node Pack"                   # human-friendly name in the registry
Icon = "https://raw.githubusercontent.com/you/my-node-pack/main/icon.png"   # square, max 400x400px
requires-comfyui = ">=1.0.0"                   # optional ComfyUI version constraint
Field rules (verified against the live spec)
Field Section Notes
name [project] Unique and immutable once published. <100 chars; alphanumeric + - _ .; no consecutive special chars; can't start with a number/special char; case-insensitive. Don't prefix with "ComfyUI".
version [project] Semantic X.Y.Z — X breaking, Y backwards-compatible feature, Z bug fix. Each value is published once and is immutable.
description [project] Short summary (recommended).
license [project] { file = "LICENSE" } or { text = "MIT License" }.
requires-python [project] e.g. ">=3.10" (recommended).
dependencies [project] PEP 508 requirement strings; can pin comfyui-frontend-package.
Repository [project.urls] Required — valid GitHub repo URL.
PublisherId [tool.comfy] Required — your publisher id (after the @ on your profile).
DisplayName [tool.comfy] Friendly registry name (optional).
Icon [tool.comfy] URL to a square image, max 400×400px; SVG/PNG/JPG/GIF.
Banner [tool.comfy] URL to a 21:9 banner image; SVG/PNG/JPG/GIF (optional).
requires-comfyui [tool.comfy] ComfyUI version range using < > <= >= ~= != (optional).
includes [tool.comfy] Array forcing extra folders into the published archive.
Controlling the published archive
  • .comfyignore uses .gitignore syntax; files listed are excluded from the published archive. Use it to drop tests, examples, large assets, and dev files.
  • [tool.comfy].includes is the inverse: it force-includes folders that would otherwise be skipped (e.g. a bundled web/dist).

Registry Setup (one-time)

  1. Go to registry.comfy.org and create a publisher.
  2. Your Publisher ID is the value after the @ on your profile page. It is globally unique and cannot be changed. Use it for PublisherId in pyproject.toml.
  3. In the publisher's section, create an API key. Name it and save it somewhere safe. If you lose it you must create a new one; it is not recoverable.

CLI Publishing Flow

Install comfy-cli (requires Python 3.10+; a virtualenv is recommended):

pip install comfy-cli
Command What it does
comfy node init Scaffolds pyproject.toml with registry metadata in the current node pack folder. Fill in the required fields (esp. PublisherId and Repository).
comfy node publish Validates and uploads the current version to the registry. Prompts for your API key. Prints the registry URL on success.

Versions are immutable. Once a version is published it cannot be modified or overwritten. To ship changes, bump version and publish again. To pull a bad version, deprecate it on the website (More Actions > Deprecate), which prompts users to upgrade rather than deleting it.

CI Publishing (GitHub Actions)

Automate publishing on every version bump. Add the API key as a repo secret named REGISTRY_ACCESS_TOKEN (Settings > Secrets and variables > Actions), then create .github/workflows/publish_action.yml:

name: Publish to Comfy registry
on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - "pyproject.toml"

jobs:
  publish-node:
    name: Publish Custom Node to registry
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v4
      - name: Publish Custom Node
        uses: Comfy-Org/publish-node-action@main
        with:
          personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
  • Triggers on push to main but only when pyproject.toml changes (i.e. when you bump version). workflow_dispatch allows manual runs.
  • If your default branch isn't main, update the branches: list.
  • The action reads the version from pyproject.toml and publishes it, so the typical flow is bump version, commit, push to main, done.

Optional Frontend Extension

If your pack adds custom UI (widgets, sidebar tabs, menu items), set WEB_DIRECTORY in __init__.py and ship JS there. New frontend extensions should target the modern @comfyorg/extension-api rather than poking at legacy globals; pull in @comfyorg/comfyui-frontend-types for TypeScript types (npm install -D @comfyorg/comfyui-frontend-types). For the full frontend authoring workflow (defineExtension/defineNode/defineWidget and the defineSidebarTab/defineCommand/defineSetting shell APIs), see the sibling comfyui-frontend-extensions skill.

Common Mistakes

  1. Forgetting the return tuple. The FUNCTION method must return (value,), not return value, even for one output.
  2. Single-element RETURN_TYPES without a comma. ("IMAGE") is a string, not a tuple. Write ("IMAGE",).
  3. INPUT_TYPES not a @classmethod. ComfyUI calls it on the class; missing the decorator breaks node loading.
  4. Trying to overwrite a published version. Versions are immutable. Bump version instead; deprecate bad ones on the website.
  5. Renaming name after publishing. It's immutable and globally unique. Pick a good name (no "ComfyUI" prefix) up front.
  6. Missing [project.urls].Repository. It's required; publishing fails without a valid repo URL.
  7. Wrong PublisherId. Use the id after the @ on your profile, not your display name.
  8. Oversized icon. Must be square and ≤ 400×400px; larger images are rejected.
  9. Renaming class keys in NODE_CLASS_MAPPINGS. The key is the class_type stored in workflow JSON. Changing it breaks every saved workflow that used the node.
  10. Committing the API key. Store it as the REGISTRY_ACCESS_TOKEN secret; never in pyproject.toml or the repo.

Sources

  • Official: Comfy Registry at https://registry.comfy.org and comfy-cli publishing docs used by comfy node publish.
  • Empirical: field-rule notes verified against the live spec; common-mistakes list is from observed publish failures.
1---
2name: comfyui-node-registry
3description: Authoring & publishing ComfyUI custom nodes to the Comfy Registry, covering node structure, pyproject.toml spec, comfy-cli publishing, and CI
4---
5 
6# Authoring & Publishing ComfyUI Custom Nodes
7 
8This skill covers writing a ComfyUI custom node pack and publishing it to the Comfy Registry (registry.comfy.org), the public catalog that powers ComfyUI-Manager. For *using* existing nodes in workflows, see the `comfyui-core` skill instead.
9 
10## Minimal Node Pack Structure
11 
12A node pack is a Python package placed under `ComfyUI/custom_nodes/<name>/`. The package `__init__.py` must export `NODE_CLASS_MAPPINGS` and `NODE_DISPLAY_NAME_MAPPINGS`; `WEB_DIRECTORY` is optional (only if the pack ships frontend JS).
13 
14```
15ComfyUI/custom_nodes/my-node-pack/
16├── __init__.py # exports the mappings ComfyUI scans for
17├── nodes.py # node class definitions
18├── pyproject.toml # registry metadata (required to publish)
19├── requirements.txt # optional Python deps
20├── .comfyignore # optional — exclude files from the published archive
21├── LICENSE
22├── README.md
23└── web/js/ # optional frontend extension (see WEB_DIRECTORY)
24```
25 
26### `__init__.py`
27 
28```python
29from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
30 
31# Optional: serve frontend JS/CSS from this folder (path relative to __init__.py)
32WEB_DIRECTORY = "./web/js"
33 
34__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
35```
36 
37### A minimal node class (`nodes.py`)
38 
39```python
40class ImageSelector:
41 CATEGORY = "example" # menu path where the node appears
42 
43 @classmethod
44 def INPUT_TYPES(cls):
45 return {
46 "required": {
47 "images": ("IMAGE",),
48 "mode": (["brightest", "reddest", "greenest", "bluest"],),
49 },
50 "optional": {
51 "threshold": ("FLOAT", {"default": 0.5, "min": 0.0, "max": 1.0, "step": 0.01}),
52 "count": ("INT", {"default": 1, "min": 1, "max": 64}),
53 "label": ("STRING", {"default": "", "multiline": False}),
54 },
55 }
56 
57 RETURN_TYPES = ("IMAGE",) # tuple of output data types
58 RETURN_NAMES = ("image",) # optional friendly output names
59 FUNCTION = "choose_image" # name of the method ComfyUI calls
60 OUTPUT_NODE = False # True for terminal nodes (e.g. SaveImage)
61 
62 def choose_image(self, images, mode, threshold=0.5, count=1, label=""):
63 import torch
64 brightness = [torch.mean(img.flatten()).item() for img in images]
65 best = brightness.index(max(brightness))
66 return (images[best].unsqueeze(0),) # MUST return a tuple
67 
68 
69NODE_CLASS_MAPPINGS = {
70 "ImageSelector": ImageSelector, # globally unique class_type key
71}
72 
73NODE_DISPLAY_NAME_MAPPINGS = {
74 "ImageSelector": "Image Selector", # label shown in the UI
75}
76```
77 
78### Node class contract
79 
80| Member | Required | Purpose |
81|--------|----------|---------|
82| `INPUT_TYPES` | yes | `@classmethod` returning `{"required": {...}, "optional": {...}}`. Each input is `(TYPE,)` or `(TYPE, {opts})`. |
83| `RETURN_TYPES` | yes | Tuple of output type strings (e.g. `("IMAGE", "MASK")`). Single output still needs a trailing comma. |
84| `FUNCTION` | yes | String name of the method to execute. |
85| `CATEGORY` | yes | Menu path string for the Add Node menu. |
86| `RETURN_NAMES` | no | Friendly names for outputs (defaults to lowercased types). |
87| `OUTPUT_NODE` | no | `True` marks a terminal node that produces a result (save/preview). |
88 
89The options dict drives the UI widget for each input type:
90- `("INT", {"default": 0, "min": 0, "max": 100, "step": 1})`
91- `("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.1})`
92- `("STRING", {"default": "", "multiline": True})`
93- `(["a", "b", "c"],)`, a literal list, becomes a dropdown
94- `("IMAGE",)`, `("LATENT",)`, `("MODEL",)` etc. are typed connections (no widget)
95 
96The executing method must return a tuple matching `RETURN_TYPES`, even for a single output (`return (result,)`).
97 
98## `pyproject.toml` — Registry Metadata
99 
100Required to publish. `comfy node init` scaffolds this file. See `references/pyproject.toml` for a fully-commented example.
101 
102```toml
103[project]
104name = "my-node-pack" # unique & IMMUTABLE; lowercase, <100 chars, no "ComfyUI" prefix
105description = "What this node pack does"
106version = "1.0.0" # semantic version X.Y.Z — bump to publish a new version
107license = { file = "LICENSE" } # or { text = "MIT License" }
108requires-python = ">=3.10"
109dependencies = [
110 "comfyui-frontend-package<=1.21.6", # optional — pin frontend if you ship UI
111]
112classifiers = [
113 "Operating System :: OS Independent",
114]
115 
116[project.urls]
117Repository = "https://github.com/you/my-node-pack" # REQUIRED — must be a valid repo URL
118Documentation = "https://github.com/you/my-node-pack/wiki"
119"Bug Tracker" = "https://github.com/you/my-node-pack/issues"
120 
121[tool.comfy]
122PublisherId = "your-publisher-id" # the id after @ on your registry profile
123DisplayName = "My Node Pack" # human-friendly name in the registry
124Icon = "https://raw.githubusercontent.com/you/my-node-pack/main/icon.png" # square, max 400x400px
125requires-comfyui = ">=1.0.0" # optional ComfyUI version constraint
126```
127 
128### Field rules (verified against the live spec)
129 
130| Field | Section | Notes |
131|-------|---------|-------|
132| `name` | `[project]` | **Unique and immutable** once published. <100 chars; alphanumeric + `-` `_` `.`; no consecutive special chars; can't start with a number/special char; case-insensitive. Don't prefix with "ComfyUI". |
133| `version` | `[project]` | **Semantic** `X.Y.Z` — X breaking, Y backwards-compatible feature, Z bug fix. Each value is published **once** and is immutable. |
134| `description` | `[project]` | Short summary (recommended). |
135| `license` | `[project]` | `{ file = "LICENSE" }` or `{ text = "MIT License" }`. |
136| `requires-python` | `[project]` | e.g. `">=3.10"` (recommended). |
137| `dependencies` | `[project]` | PEP 508 requirement strings; can pin `comfyui-frontend-package`. |
138| `Repository` | `[project.urls]` | **Required** — valid GitHub repo URL. |
139| `PublisherId` | `[tool.comfy]` | **Required** — your publisher id (after the `@` on your profile). |
140| `DisplayName` | `[tool.comfy]` | Friendly registry name (optional). |
141| `Icon` | `[tool.comfy]` | URL to a **square** image, **max 400×400px**; SVG/PNG/JPG/GIF. |
142| `Banner` | `[tool.comfy]` | URL to a **21:9** banner image; SVG/PNG/JPG/GIF (optional). |
143| `requires-comfyui` | `[tool.comfy]` | ComfyUI version range using `< > <= >= ~= !=` (optional). |
144| `includes` | `[tool.comfy]` | Array forcing extra folders into the published archive. |
145 
146### Controlling the published archive
147 
148- `.comfyignore` uses `.gitignore` syntax; files listed are excluded from the published archive. Use it to drop tests, examples, large assets, and dev files.
149- `[tool.comfy].includes` is the inverse: it force-includes folders that would otherwise be skipped (e.g. a bundled `web/dist`).
150 
151## Registry Setup (one-time)
152 
1531. Go to registry.comfy.org and create a publisher.
1542. Your Publisher ID is the value after the `@` on your profile page. It is globally unique and cannot be changed. Use it for `PublisherId` in `pyproject.toml`.
1553. In the publisher's section, create an API key. Name it and save it somewhere safe. If you lose it you must create a new one; it is not recoverable.
156 
157## CLI Publishing Flow
158 
159Install comfy-cli (requires Python 3.10+; a virtualenv is recommended):
160 
161```bash
162pip install comfy-cli
163```
164 
165| Command | What it does |
166|---------|--------------|
167| `comfy node init` | Scaffolds `pyproject.toml` with registry metadata in the current node pack folder. Fill in the required fields (esp. `PublisherId` and `Repository`). |
168| `comfy node publish` | Validates and uploads the current version to the registry. **Prompts for your API key.** Prints the registry URL on success. |
169 
170Versions are immutable. Once a `version` is published it cannot be modified or overwritten. To ship changes, bump `version` and publish again. To pull a bad version, deprecate it on the website (More Actions > Deprecate), which prompts users to upgrade rather than deleting it.
171 
172## CI Publishing (GitHub Actions)
173 
174Automate publishing on every version bump. Add the API key as a repo secret named `REGISTRY_ACCESS_TOKEN` (Settings > Secrets and variables > Actions), then create `.github/workflows/publish_action.yml`:
175 
176```yaml
177name: Publish to Comfy registry
178on:
179 workflow_dispatch:
180 push:
181 branches:
182 - main
183 paths:
184 - "pyproject.toml"
185 
186jobs:
187 publish-node:
188 name: Publish Custom Node to registry
189 runs-on: ubuntu-latest
190 steps:
191 - name: Check out code
192 uses: actions/checkout@v4
193 - name: Publish Custom Node
194 uses: Comfy-Org/publish-node-action@main
195 with:
196 personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
197```
198 
199- Triggers on push to `main` but only when `pyproject.toml` changes (i.e. when you bump `version`). `workflow_dispatch` allows manual runs.
200- If your default branch isn't `main`, update the `branches:` list.
201- The action reads the version from `pyproject.toml` and publishes it, so the typical flow is bump `version`, commit, push to `main`, done.
202 
203## Optional Frontend Extension
204 
205If your pack adds custom UI (widgets, sidebar tabs, menu items), set `WEB_DIRECTORY` in `__init__.py` and ship JS there. New frontend extensions should target the modern `@comfyorg/extension-api` rather than poking at legacy globals; pull in `@comfyorg/comfyui-frontend-types` for TypeScript types (`npm install -D @comfyorg/comfyui-frontend-types`). For the full frontend authoring workflow (`defineExtension`/`defineNode`/`defineWidget` and the `defineSidebarTab`/`defineCommand`/`defineSetting` shell APIs), see the sibling `comfyui-frontend-extensions` skill.
206 
207## Common Mistakes
208 
2091. **Forgetting the return tuple.** The `FUNCTION` method must `return (value,)`, not `return value`, even for one output.
2102. **Single-element `RETURN_TYPES` without a comma.** `("IMAGE")` is a string, not a tuple. Write `("IMAGE",)`.
2113. **`INPUT_TYPES` not a `@classmethod`.** ComfyUI calls it on the class; missing the decorator breaks node loading.
2124. **Trying to overwrite a published version.** Versions are immutable. Bump `version` instead; deprecate bad ones on the website.
2135. **Renaming `name` after publishing.** It's immutable and globally unique. Pick a good name (no "ComfyUI" prefix) up front.
2146. **Missing `[project.urls].Repository`.** It's required; publishing fails without a valid repo URL.
2157. **Wrong `PublisherId`.** Use the id after the `@` on your profile, not your display name.
2168. **Oversized icon.** Must be square and ≤ 400×400px; larger images are rejected.
2179. **Renaming class keys in `NODE_CLASS_MAPPINGS`.** The key is the `class_type` stored in workflow JSON. Changing it breaks every saved workflow that used the node.
21810. **Committing the API key.** Store it as the `REGISTRY_ACCESS_TOKEN` secret; never in `pyproject.toml` or the repo.
219 
220## Sources
221 
222- **Official:** Comfy Registry at https://registry.comfy.org and comfy-cli publishing docs used by `comfy node publish`.
223- **Empirical:** field-rule notes verified against the live spec; common-mistakes list is from observed publish failures.
224 
View all files on GitHub →

Details

Updated
Sep 21, 2026
License
MIT
Stars on the repo
★ 759
Checked
Source
artokun/comfyui-mcp ↗
Creator
artokun · 44 listings
View creator

Similar skills

See all →
SkillMake Japanese TV-anime style videos with codeAnime celedenfunf/reelmimic · by edenfunfMake Japanese TV-anime style videos (MP4) with code — cel-shaded characters with tapered line art, big detailed eyes, hair clumps with a specular band, comedic anime reactions (sweat drop, anger vein, sparkle eyes, ≥< eyes, dot eyes, tears), painted skies with cumulus clouds, school/street/classroom/rooftop sets with time-of-day palettes, speed/focus lines, impact frames, dramatic zooms, smears, sakura petals and anime subtitles (CJK). Canvas 2D rendered frame by frame in headless Chrome, encoded with ffmpeg. Use when a reference video or brief calls for anime / 動畫 / 日系動畫 / アニメ / cel-shaded / slice-of-life / school romance / shōnen-style reactions, or when the video-clone router picks the anime-cel style. 2D only; characters are original (Hina, Ren) or new ones built on the same rig.★ 3.6k GitHub starsSkillDirect and produce a short film made entirely in codeLemo opuscarlemomo-ai/lemo-opuscar · by lemomo-aiDirect and produce a short film made entirely in code, in one of the styles of the Lemo-Opuscar library (e.g. Impasto Oil Painting 油画厚涂, Watercolor Brush 水彩笔刷, Ukiyo-e 浮世绘, Satellite Briefing 卫星简报, Exploded Teardown 产品拆解, Microscope Story 显微叙事). Use when the user asks for a video, film, short, promo, explainer or animation (视频、短片、动画、宣传片) in a named style, including data, science and product explainers built from real material such as satellite imagery, laser scans, CAD files or archive scans (数据解说、科普、产品拆解); when they want a film made about their own topic and haven't chosen a style (help them choose); or when they ask which film styles there are. Not for editing or converting existing video files.★ 3k GitHub starsSkillGenerate Ian-style Xiaohei illustrations for articles, postsdzhng/skills · by dzhngGenerate Ian-style Xiaohei illustrations for articles, posts, blogs, Notion documents, workflows, methods, processes, structures, states, metaphors, and opinions. Use when the user asks for weird, hand-drawn, Xiaohei, article, editorial, body illustrations, illustration ideas, shot lists, title removal, image edits, or image regeneration. By default, all image text and annotations are English, even when the source article is Chinese; only use another language when the user explicitly asks.★ 1.3k GitHub starsSkillCreating game art through Scenario MCP: spritesScenario game assetsscenario-labs/skills · by scenario-labsUse when creating game art through Scenario MCP: sprites, sprite sheets, icons, props, loot, tilesets and autotile terrain transitions, seamless tiles, isometric buildings, top-down maps, pixel art, UI buttons and panels, parallax background layers or depth planes for side-scrollers, and character or concept art; or when assets need transparent backgrounds, background removal, style-consistent variation batches, upscaling, pixel-grid cleanup, or PNG export for Unity, Godot, or Unreal.★ 854 GitHub starsSkillTrain custom LoRAs with ostris AI-ToolkitAI-Toolkit LoRA Trainer (WAN 2.2 & Z-Image)artokun/comfyui-mcp · by artokunTrain custom LoRAs with ostris AI-Toolkit. Covers WAN 2.2/2.1 (people, styles, video motion) and Z-Image (Turbo & Base, low-VRAM image LoRAs). Use when the user wants to train a WAN or Z-Image LoRA; covers local + RunPod setup, dataset prep, key params, and using the result in a ComfyUI workflow.★ 759 GitHub starsSkillAnime/illustration text-to-imageANIMA 1.0 (Anima Base Ultra) Text-to-Image Workflowsartokun/comfyui-mcp · by artokunAnime/illustration text-to-image (ANIMA 1.0, ~2B Cosmos DiT). Use for anime, manga, illustrated characters; accepts Danbooru tags + natural language; runs/trains on <6GB VRAM; includes anime inpainting via Anima-LLLite ControlNet★ 759 GitHub stars

More from artokun

SkillTrain custom LoRAs with ostris AI-ToolkitAI-Toolkit LoRA Trainer (WAN 2.2 & Z-Image)artokun/comfyui-mcp · by artokunTrain custom LoRAs with ostris AI-Toolkit. Covers WAN 2.2/2.1 (people, styles, video motion) and Z-Image (Turbo & Base, low-VRAM image LoRAs). Use when the user wants to train a WAN or Z-Image LoRA; covers local + RunPod setup, dataset prep, key params, and using the result in a ComfyUI workflow.★ 759 GitHub starsSkillAnime/illustration text-to-imageANIMA 1.0 (Anima Base Ultra) Text-to-Image Workflowsartokun/comfyui-mcp · by artokunAnime/illustration text-to-image (ANIMA 1.0, ~2B Cosmos DiT). Use for anime, manga, illustrated characters; accepts Danbooru tags + natural language; runs/trains on <6GB VRAM; includes anime inpainting via Anima-LLLite ControlNet★ 759 GitHub starsSkillTrain a custom anime LoRA on the ANIMA base modelCitron Anima LoRA Trainerartokun/comfyui-mcp · by artokunTrain a custom anime LoRA on the ANIMA base model with Citron's local Gradio trainer (kohya sd-scripts), <6GB VRAM, character/style LoRAs; covers setup, dataset prep, training params, and using the result in the anima-base workflow★ 759 GitHub starsSkillDiscover Civitai models with the BUILT-IN downloadmodelCivitai + comfyui-mcpartokun/comfyui-mcp · by artokunDiscover Civitai models with the BUILT-IN download_model action:"search_civitai" and install/generate them locally. Find a checkpoint/LoRA/embedding on Civitai, download it into ComfyUI, and use its trigger words. Optionally pair the official Civitai MCP for community features (images browsing, posting, collections).★ 759 GitHub starsSkillDiagnose and fix video/image color OBJECTIVELYColor Correction (measure, don't eyeball)artokun/comfyui-mcp · by artokunDiagnose and fix video/image color OBJECTIVELY with the get_image (action:"analyze_color") tool (scopes/stats such as black/white points, contrast, saturation, clipping, cast) instead of eyeballing a contact sheet. Covers the "washed out" signature, why reference color-match (mkl/ColorMatch/ColorMatchAdobe) CAN'T add contrast a flat source lacks, the levels/contrast-stretch fix (core AdjustContrast / CurveEditor), the measure→fix→re-measure loop, the side-by-side sandbox pattern, and where to place the fix in a render graph (after decode, before save). Use when a render looks washed out / flat / dull / over-saturated / color-cast, or when deciding between a color-match and a contrast/levels fix.★ 759 GitHub starsMCPDiagnoses ComfyUI workflow failures by analyzing logsComfy debuggerartokun/comfyui-mcp · by artokunDiagnoses ComfyUI workflow failures by analyzing logs, history, and node definitions★ 759 GitHub stars