comfyui-mcp 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.beads/README.md +81 -0
- package/.beads/config.yaml +54 -0
- package/.beads/metadata.json +7 -0
- package/AGENTS.md +84 -0
- package/CLAUDE.md +48 -0
- package/README.md +26 -0
- package/dist/comfyui/client.d.ts +17 -0
- package/dist/comfyui/client.d.ts.map +1 -1
- package/dist/comfyui/client.js +39 -0
- package/dist/comfyui/client.js.map +1 -1
- package/dist/comfyui/types.d.ts +52 -0
- package/dist/comfyui/types.d.ts.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/asset-registry.d.ts +64 -0
- package/dist/services/asset-registry.d.ts.map +1 -0
- package/dist/services/asset-registry.js +118 -0
- package/dist/services/asset-registry.js.map +1 -0
- package/dist/services/defaults-manager.d.ts +31 -0
- package/dist/services/defaults-manager.d.ts.map +1 -0
- package/dist/services/defaults-manager.js +128 -0
- package/dist/services/defaults-manager.js.map +1 -0
- package/dist/services/generate-image.d.ts +35 -0
- package/dist/services/generate-image.d.ts.map +1 -0
- package/dist/services/generate-image.js +63 -0
- package/dist/services/generate-image.js.map +1 -0
- package/dist/services/image-management.d.ts +16 -0
- package/dist/services/image-management.d.ts.map +1 -1
- package/dist/services/image-management.js +32 -0
- package/dist/services/image-management.js.map +1 -1
- package/dist/services/job-watcher.d.ts +5 -1
- package/dist/services/job-watcher.d.ts.map +1 -1
- package/dist/services/job-watcher.js +42 -3
- package/dist/services/job-watcher.js.map +1 -1
- package/dist/services/process-control.js +2 -2
- package/dist/services/process-control.js.map +1 -1
- package/dist/services/view-image.d.ts +17 -0
- package/dist/services/view-image.d.ts.map +1 -0
- package/dist/services/view-image.js +36 -0
- package/dist/services/view-image.js.map +1 -0
- package/dist/services/workflow-autoload.d.ts +41 -0
- package/dist/services/workflow-autoload.d.ts.map +1 -0
- package/dist/services/workflow-autoload.js +172 -0
- package/dist/services/workflow-autoload.js.map +1 -0
- package/dist/services/workflow-converter.d.ts +15 -0
- package/dist/services/workflow-converter.d.ts.map +1 -1
- package/dist/services/workflow-converter.js +333 -5
- package/dist/services/workflow-converter.js.map +1 -1
- package/dist/services/workflow-executor.d.ts.map +1 -1
- package/dist/services/workflow-executor.js +4 -2
- package/dist/services/workflow-executor.js.map +1 -1
- package/dist/tools/assets.d.ts +3 -0
- package/dist/tools/assets.d.ts.map +1 -0
- package/dist/tools/assets.js +128 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/defaults.d.ts +3 -0
- package/dist/tools/defaults.d.ts.map +1 -0
- package/dist/tools/defaults.js +57 -0
- package/dist/tools/defaults.js.map +1 -0
- package/dist/tools/diagnostics.d.ts.map +1 -1
- package/dist/tools/diagnostics.js +14 -3
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/generate-image.d.ts +3 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +61 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/image-management.d.ts.map +1 -1
- package/dist/tools/image-management.js +99 -11
- package/dist/tools/image-management.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +13 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/workflow-autoload.d.ts +9 -0
- package/dist/tools/workflow-autoload.d.ts.map +1 -0
- package/dist/tools/workflow-autoload.js +64 -0
- package/dist/tools/workflow-autoload.js.map +1 -0
- package/package.json +2 -1
- package/plugin/scripts/monitor-progress.mjs +9 -5
- package/server.json +21 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { DefaultsManager } from "../services/defaults-manager.js";
|
|
3
|
+
import { errorToToolResult } from "../utils/errors.js";
|
|
4
|
+
export function registerDefaultsTools(server) {
|
|
5
|
+
server.tool("get_defaults", "Return the merged view of generation defaults with per-source attribution. " +
|
|
6
|
+
"Precedence (lowest → highest): config file → COMFYUI_DEFAULT_* env vars → runtime overrides via set_defaults. " +
|
|
7
|
+
"Per-call MCP tool args always win over these defaults when consumed by a workflow-construction tool.", {}, async () => {
|
|
8
|
+
try {
|
|
9
|
+
const resolved = DefaultsManager.getAll();
|
|
10
|
+
return {
|
|
11
|
+
content: [
|
|
12
|
+
{
|
|
13
|
+
type: "text",
|
|
14
|
+
text: JSON.stringify({
|
|
15
|
+
config_path: DefaultsManager.getConfigPath(),
|
|
16
|
+
defaults: resolved,
|
|
17
|
+
}, null, 2),
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return errorToToolResult(err);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
server.tool("set_defaults", "Update generation defaults. By default updates the in-memory runtime layer (lost on restart). " +
|
|
27
|
+
"Pass persist=true to also write the change into the config file (~/.config/comfyui-mcp/config.json by default). " +
|
|
28
|
+
"Use this to avoid repeating common values like width, height, steps, cfg, sampler, checkpoint.", {
|
|
29
|
+
values: z
|
|
30
|
+
.record(z.string(), z.any())
|
|
31
|
+
.describe("Key/value map of defaults to set. Keys are typically lowercase (e.g. width, steps)."),
|
|
32
|
+
persist: z
|
|
33
|
+
.boolean()
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("If true, write to the config file in addition to runtime."),
|
|
36
|
+
}, async ({ values, persist }) => {
|
|
37
|
+
try {
|
|
38
|
+
await DefaultsManager.set(values, { persist });
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: JSON.stringify({
|
|
44
|
+
status: persist ? "updated_runtime_and_config" : "updated_runtime",
|
|
45
|
+
config_path: DefaultsManager.getConfigPath(),
|
|
46
|
+
defaults: DefaultsManager.getAll(),
|
|
47
|
+
}, null, 2),
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return errorToToolResult(err);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/tools/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,6EAA6E;QAC3E,gHAAgH;QAChH,sGAAsG,EACxG,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,WAAW,EAAE,eAAe,CAAC,aAAa,EAAE;4BAC5C,QAAQ,EAAE,QAAQ;yBACnB,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,gGAAgG;QAC9F,kHAAkH;QAClH,gGAAgG,EAClG;QACE,MAAM,EAAE,CAAC;aACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;aAC3B,QAAQ,CAAC,qFAAqF,CAAC;QAClG,OAAO,EAAE,CAAC;aACP,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,2DAA2D,CAAC;KACzE,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,iBAAiB;4BAClE,WAAW,EAAE,eAAe,CAAC,aAAa,EAAE;4BAC5C,QAAQ,EAAE,eAAe,CAAC,MAAM,EAAE;yBACnC,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuGzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwFhE"}
|
|
@@ -53,15 +53,26 @@ function formatHistoryEntry(promptId, entry) {
|
|
|
53
53
|
lines.push("");
|
|
54
54
|
lines.push("**Execution was interrupted/cancelled**");
|
|
55
55
|
}
|
|
56
|
-
// Output nodes
|
|
57
56
|
const outputKeys = Object.keys(entry.outputs || {});
|
|
58
57
|
if (outputKeys.length > 0) {
|
|
59
58
|
lines.push("");
|
|
60
59
|
lines.push(`### Outputs (${outputKeys.length} nodes)`);
|
|
61
60
|
for (const nodeId of outputKeys) {
|
|
62
61
|
const output = entry.outputs[nodeId];
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
// Expand image filenames so callers can use get_image directly
|
|
63
|
+
if (Array.isArray(output.images)) {
|
|
64
|
+
const imgs = output.images;
|
|
65
|
+
const fileList = imgs
|
|
66
|
+
.map((img) => img.subfolder
|
|
67
|
+
? `${img.subfolder}/${img.filename}`
|
|
68
|
+
: img.filename)
|
|
69
|
+
.join(", ");
|
|
70
|
+
lines.push(`- Node ${nodeId}: images → **${fileList}**`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const outputTypes = Object.keys(output);
|
|
74
|
+
lines.push(`- Node ${nodeId}: ${outputTypes.join(", ")}`);
|
|
75
|
+
}
|
|
65
76
|
}
|
|
66
77
|
}
|
|
67
78
|
return lines.join("\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/tools/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-image.d.ts","sourceRoot":"","sources":["../../src/tools/generate-image.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqDjE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateImage } from "../services/generate-image.js";
|
|
3
|
+
import { enqueueWorkflow } from "../services/workflow-executor.js";
|
|
4
|
+
import { listLocalModels } from "../services/model-resolver.js";
|
|
5
|
+
import { errorToToolResult } from "../utils/errors.js";
|
|
6
|
+
async function resolveCheckpoint() {
|
|
7
|
+
try {
|
|
8
|
+
const models = await listLocalModels("checkpoints");
|
|
9
|
+
return models[0]?.name;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function registerGenerateImageTool(server) {
|
|
16
|
+
server.tool("generate_image", "Generate an image from a text prompt — the high-level entry point. Builds a txt2img workflow, " +
|
|
17
|
+
"filling any unspecified parameter from your configured defaults (set_defaults / COMFYUI_DEFAULT_* / config file), " +
|
|
18
|
+
"auto-selecting a local checkpoint when none is given. Returns the prompt_id immediately; the resulting " +
|
|
19
|
+
"asset_id arrives in the completion notification and can be passed to view_image or regenerate. " +
|
|
20
|
+
"For full control over the node graph, use create_workflow + enqueue_workflow instead.", {
|
|
21
|
+
prompt: z.string().describe("Positive text prompt"),
|
|
22
|
+
negative_prompt: z.string().optional().describe("Negative prompt (default: empty / from defaults)"),
|
|
23
|
+
width: z.number().int().positive().optional().describe("Image width"),
|
|
24
|
+
height: z.number().int().positive().optional().describe("Image height"),
|
|
25
|
+
steps: z.number().int().positive().optional().describe("Sampling steps"),
|
|
26
|
+
cfg: z.number().positive().optional().describe("CFG scale"),
|
|
27
|
+
sampler: z.string().optional().describe("Sampler name (e.g. euler, dpmpp_2m)"),
|
|
28
|
+
scheduler: z.string().optional().describe("Scheduler (e.g. normal, karras)"),
|
|
29
|
+
seed: z.number().int().optional().describe("Seed (omit to randomize)"),
|
|
30
|
+
checkpoint: z
|
|
31
|
+
.string()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("Checkpoint filename; auto-selected from local models if omitted"),
|
|
34
|
+
batch_size: z.number().int().positive().optional().describe("Number of images to generate"),
|
|
35
|
+
}, async (args) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = await generateImage(args, {
|
|
38
|
+
resolveCheckpoint,
|
|
39
|
+
enqueue: (workflow) => enqueueWorkflow(workflow),
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
content: [
|
|
43
|
+
{
|
|
44
|
+
type: "text",
|
|
45
|
+
text: JSON.stringify({
|
|
46
|
+
status: "enqueued",
|
|
47
|
+
prompt_id: result.prompt_id,
|
|
48
|
+
queue_remaining: result.queue_remaining,
|
|
49
|
+
checkpoint: result.checkpoint,
|
|
50
|
+
note: "asset_id will be available in the completion notification; use view_image or regenerate with it.",
|
|
51
|
+
}, null, 2),
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return errorToToolResult(err);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=generate-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-image.js","sourceRoot":"","sources":["../../src/tools/generate-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-management.d.ts","sourceRoot":"","sources":["../../src/tools/image-management.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"image-management.d.ts","sourceRoot":"","sources":["../../src/tools/image-management.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgOpE"}
|
|
@@ -1,32 +1,113 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
2
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
import { join, basename } from "node:path";
|
|
4
|
+
import { uploadImage, extractWorkflowFromImage, listOutputImages, getOutputImage, uploadImageAuto, } from "../services/image-management.js";
|
|
3
5
|
import { errorToToolResult } from "../utils/errors.js";
|
|
4
6
|
export function registerImageManagementTools(server) {
|
|
5
|
-
|
|
7
|
+
// ── get_image ────────────────────────────────────────────────────────────
|
|
8
|
+
// Fetches a generated image from ComfyUI via HTTP /view.
|
|
9
|
+
// Works with remote ComfyUI — no COMFYUI_PATH required.
|
|
10
|
+
server.tool("get_image", "Fetch a generated image from ComfyUI and return it as an inline image. " +
|
|
11
|
+
"Works with remote ComfyUI instances — does not require COMFYUI_PATH. " +
|
|
12
|
+
"Use get_history first to obtain the filename.", {
|
|
13
|
+
filename: z
|
|
14
|
+
.string()
|
|
15
|
+
.describe("Output image filename, e.g. PulID_Klein_00001_.png"),
|
|
16
|
+
type: z
|
|
17
|
+
.enum(["output", "input", "temp"])
|
|
18
|
+
.optional()
|
|
19
|
+
.default("output")
|
|
20
|
+
.describe("Image directory: output (default), input, or temp"),
|
|
21
|
+
subfolder: z
|
|
22
|
+
.string()
|
|
23
|
+
.optional()
|
|
24
|
+
.default("")
|
|
25
|
+
.describe("Subfolder within the directory, if any"),
|
|
26
|
+
save_dir: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Local directory to save the image file. Defaults to /tmp/comfyui-images/."),
|
|
30
|
+
}, async (args) => {
|
|
31
|
+
try {
|
|
32
|
+
const { base64, mimeType } = await getOutputImage(args.filename, args.type ?? "output", args.subfolder ?? "");
|
|
33
|
+
// Save to local file
|
|
34
|
+
const saveDir = args.save_dir ?? process.cwd();
|
|
35
|
+
await mkdir(saveDir, { recursive: true });
|
|
36
|
+
const localFilename = basename(args.filename);
|
|
37
|
+
const savePath = join(saveDir, localFilename);
|
|
38
|
+
await writeFile(savePath, Buffer.from(base64, "base64"));
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: `Saved to: ${savePath}`,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
type: "image",
|
|
47
|
+
data: base64,
|
|
48
|
+
mimeType,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return errorToToolResult(err);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// ── upload_image ─────────────────────────────────────────────────────────
|
|
58
|
+
// Tries HTTP upload first (works remote), falls back to filesystem copy.
|
|
59
|
+
server.tool("upload_image", "Upload a local image file to ComfyUI's input/ directory so it can be " +
|
|
60
|
+
"referenced in LoadImage nodes. Tries HTTP upload first (works with " +
|
|
61
|
+
"remote ComfyUI), falls back to filesystem copy when COMFYUI_PATH is set.", {
|
|
6
62
|
source_path: z
|
|
7
63
|
.string()
|
|
8
64
|
.describe("Absolute path to the local image file to upload"),
|
|
9
65
|
filename: z
|
|
10
66
|
.string()
|
|
11
67
|
.optional()
|
|
12
|
-
.describe("Override the filename in ComfyUI's input/ directory.
|
|
68
|
+
.describe("Override the filename in ComfyUI's input/ directory. " +
|
|
69
|
+
"Auto-detected from source path if omitted."),
|
|
13
70
|
}, async (args) => {
|
|
14
71
|
try {
|
|
15
|
-
|
|
72
|
+
// Try HTTP upload first (works for remote ComfyUI)
|
|
73
|
+
const result = await uploadImageAuto(args.source_path, args.filename);
|
|
16
74
|
return {
|
|
17
75
|
content: [
|
|
18
76
|
{
|
|
19
77
|
type: "text",
|
|
20
|
-
text: `Image uploaded successfully.\n\
|
|
78
|
+
text: `Image uploaded successfully via HTTP.\n\n` +
|
|
79
|
+
`Filename: ${result.filename}\n\n` +
|
|
80
|
+
`Use "${result.filename}" as the \`image\` input in LoadImage nodes.`,
|
|
21
81
|
},
|
|
22
82
|
],
|
|
23
83
|
};
|
|
24
84
|
}
|
|
25
|
-
catch (
|
|
26
|
-
|
|
85
|
+
catch (httpErr) {
|
|
86
|
+
// Fall back to filesystem copy if HTTP fails and COMFYUI_PATH is set
|
|
87
|
+
try {
|
|
88
|
+
const result = await uploadImage(args.source_path, args.filename);
|
|
89
|
+
return {
|
|
90
|
+
content: [
|
|
91
|
+
{
|
|
92
|
+
type: "text",
|
|
93
|
+
text: `Image uploaded successfully via filesystem.\n\n` +
|
|
94
|
+
`Filename: ${result.filename}\nPath: ${result.path}\n\n` +
|
|
95
|
+
`Use "${result.filename}" as the \`image\` input in LoadImage nodes.`,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (fsErr) {
|
|
101
|
+
// Both failed — report both errors
|
|
102
|
+
return errorToToolResult(new Error(`HTTP upload failed: ${httpErr instanceof Error ? httpErr.message : httpErr}\n` +
|
|
103
|
+
`Filesystem fallback also failed: ${fsErr instanceof Error ? fsErr.message : fsErr}`));
|
|
104
|
+
}
|
|
27
105
|
}
|
|
28
106
|
});
|
|
29
|
-
|
|
107
|
+
// ── workflow_from_image ───────────────────────────────────────────────────
|
|
108
|
+
server.tool("workflow_from_image", "Extract embedded ComfyUI workflow metadata from a PNG file. " +
|
|
109
|
+
"ComfyUI stores the full workflow (API format) and prompt data in PNG tEXt chunks. " +
|
|
110
|
+
"Use this to reverse-engineer how any ComfyUI image was generated.", {
|
|
30
111
|
image_path: z
|
|
31
112
|
.string()
|
|
32
113
|
.describe("Absolute path to a ComfyUI-generated PNG file"),
|
|
@@ -35,10 +116,14 @@ export function registerImageManagementTools(server) {
|
|
|
35
116
|
const result = await extractWorkflowFromImage(args.image_path);
|
|
36
117
|
const sections = [];
|
|
37
118
|
if (result.prompt) {
|
|
38
|
-
sections.push("## API Format (prompt)\n\nThis is the executable workflow format:\n```json\n" +
|
|
119
|
+
sections.push("## API Format (prompt)\n\nThis is the executable workflow format:\n```json\n" +
|
|
120
|
+
JSON.stringify(result.prompt, null, 2) +
|
|
121
|
+
"\n```");
|
|
39
122
|
}
|
|
40
123
|
if (result.workflow) {
|
|
41
|
-
sections.push("## UI Format (workflow)\n\nThis is the ComfyUI web UI format with layout data:\n```json\n" +
|
|
124
|
+
sections.push("## UI Format (workflow)\n\nThis is the ComfyUI web UI format with layout data:\n```json\n" +
|
|
125
|
+
JSON.stringify(result.workflow, null, 2) +
|
|
126
|
+
"\n```");
|
|
42
127
|
}
|
|
43
128
|
return {
|
|
44
129
|
content: [
|
|
@@ -53,7 +138,10 @@ export function registerImageManagementTools(server) {
|
|
|
53
138
|
return errorToToolResult(err);
|
|
54
139
|
}
|
|
55
140
|
});
|
|
56
|
-
|
|
141
|
+
// ── list_output_images ────────────────────────────────────────────────────
|
|
142
|
+
server.tool("list_output_images", "List recently generated images from ComfyUI's output directory. " +
|
|
143
|
+
"Returns filenames sorted newest-first. Requires COMFYUI_PATH. " +
|
|
144
|
+
"For remote ComfyUI, use get_history to find filenames, then get_image to fetch them.", {
|
|
57
145
|
limit: z
|
|
58
146
|
.number()
|
|
59
147
|
.int()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-management.js","sourceRoot":"","sources":["../../src/tools/image-management.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"image-management.js","sourceRoot":"","sources":["../../src/tools/image-management.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvE"}
|
package/dist/tools/index.js
CHANGED
|
@@ -12,7 +12,15 @@ import { registerProcessControlTools } from "./process-control.js";
|
|
|
12
12
|
import { registerImageManagementTools } from "./image-management.js";
|
|
13
13
|
import { registerMemoryManagementTools } from "./memory-management.js";
|
|
14
14
|
import { registerGenerationTrackerTools } from "./generation-tracker.js";
|
|
15
|
-
|
|
15
|
+
import { registerAssetTools } from "./assets.js";
|
|
16
|
+
import { registerAutoloadedWorkflows } from "./workflow-autoload.js";
|
|
17
|
+
import { registerDefaultsTools } from "./defaults.js";
|
|
18
|
+
import { registerGenerateImageTool } from "./generate-image.js";
|
|
19
|
+
import { DefaultsManager } from "../services/defaults-manager.js";
|
|
20
|
+
export async function registerAllTools(server) {
|
|
21
|
+
// Hydrate persisted defaults before any tool registration so subsequent
|
|
22
|
+
// tools can consult DefaultsManager.apply() against a fully-resolved view.
|
|
23
|
+
await DefaultsManager.load();
|
|
16
24
|
registerWorkflowExecuteTools(server);
|
|
17
25
|
registerWorkflowVisualizeTools(server);
|
|
18
26
|
registerWorkflowComposeTools(server);
|
|
@@ -27,5 +35,9 @@ export function registerAllTools(server) {
|
|
|
27
35
|
registerImageManagementTools(server);
|
|
28
36
|
registerMemoryManagementTools(server);
|
|
29
37
|
registerGenerationTrackerTools(server);
|
|
38
|
+
registerAssetTools(server);
|
|
39
|
+
registerDefaultsTools(server);
|
|
40
|
+
registerGenerateImageTool(server);
|
|
41
|
+
await registerAutoloadedWorkflows(server);
|
|
30
42
|
}
|
|
31
43
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,wEAAwE;IACxE,2EAA2E;IAC3E,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;IAC7B,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Discover workflow JSON files in COMFYUI_WORKFLOWS_DIR (default
|
|
4
|
+
* `~/.comfyui-mcp/workflows`) and register each as its own MCP tool with a
|
|
5
|
+
* schema derived from its PARAM_* placeholders. Failures are logged and do
|
|
6
|
+
* not abort startup.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerAutoloadedWorkflows(server: McpServer): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=workflow-autoload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-autoload.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-autoload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DlF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { discoverWorkflows, buildToolSchema, applyParams, getWorkflowsDir, } from "../services/workflow-autoload.js";
|
|
2
|
+
import { enqueueWorkflow } from "../services/workflow-executor.js";
|
|
3
|
+
import { errorToToolResult } from "../utils/errors.js";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
/**
|
|
6
|
+
* Discover workflow JSON files in COMFYUI_WORKFLOWS_DIR (default
|
|
7
|
+
* `~/.comfyui-mcp/workflows`) and register each as its own MCP tool with a
|
|
8
|
+
* schema derived from its PARAM_* placeholders. Failures are logged and do
|
|
9
|
+
* not abort startup.
|
|
10
|
+
*/
|
|
11
|
+
export async function registerAutoloadedWorkflows(server) {
|
|
12
|
+
const dir = getWorkflowsDir();
|
|
13
|
+
let discovered;
|
|
14
|
+
try {
|
|
15
|
+
discovered = await discoverWorkflows(dir);
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
logger.warn("Workflow autoload discovery failed", {
|
|
19
|
+
dir,
|
|
20
|
+
error: err instanceof Error ? err.message : err,
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (discovered.length === 0) {
|
|
25
|
+
logger.info("No autoloaded workflows discovered", { dir });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
for (const wf of discovered) {
|
|
29
|
+
const shape = buildToolSchema(wf.placeholders);
|
|
30
|
+
const paramSummary = wf.placeholders
|
|
31
|
+
.map((p) => `${p.name}:${p.type}`)
|
|
32
|
+
.filter((s, i, a) => a.indexOf(s) === i)
|
|
33
|
+
.join(", ");
|
|
34
|
+
const description = `Run the autoloaded workflow "${wf.toolName}" (from ${wf.filePath}). ` +
|
|
35
|
+
`Params: ${paramSummary || "(none)"}`;
|
|
36
|
+
server.tool(wf.toolName, description, shape, async (args) => {
|
|
37
|
+
try {
|
|
38
|
+
const built = applyParams(wf.workflow, wf.placeholders, args);
|
|
39
|
+
const result = await enqueueWorkflow(built);
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{
|
|
43
|
+
type: "text",
|
|
44
|
+
text: JSON.stringify({
|
|
45
|
+
status: "enqueued",
|
|
46
|
+
tool: wf.toolName,
|
|
47
|
+
prompt_id: result.prompt_id,
|
|
48
|
+
queue_remaining: result.queue_remaining,
|
|
49
|
+
}, null, 2),
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return errorToToolResult(err);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
logger.info("Registered autoloaded workflow tool", {
|
|
59
|
+
tool: wf.toolName,
|
|
60
|
+
params: wf.placeholders.length,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=workflow-autoload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-autoload.js","sourceRoot":"","sources":["../../src/tools/workflow-autoload.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,eAAe,GAEhB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,MAAiB;IACjE,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,UAAgC,CAAC;IACrC,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;YAChD,GAAG;YACH,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;SAChD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACvC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,WAAW,GACf,gCAAgC,EAAE,CAAC,QAAQ,WAAW,EAAE,CAAC,QAAQ,KAAK;YACtE,WAAW,YAAY,IAAI,QAAQ,EAAE,CAAC;QAExC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1D,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,EAAE,IAA+B,CAAC,CAAC;gBACzF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;gBAC5C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,MAAM,EAAE,UAAU;gCAClB,IAAI,EAAE,EAAE,CAAC,QAAQ;gCACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gCAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;6BACxC,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;YACjD,IAAI,EAAE,EAAE,CAAC,QAAQ;YACjB,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;SAC/B,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "comfyui-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"mcpName": "io.github.artokun/comfyui-mcp",
|
|
4
5
|
"description": "MCP server for ComfyUI — workflow execution, visualization, composition, registry, and skill generation",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "dist/index.js",
|
|
@@ -9,11 +9,15 @@
|
|
|
9
9
|
* Detects stalls (no progress for too long) and unreachable servers.
|
|
10
10
|
* Exits when all tracked jobs complete.
|
|
11
11
|
*
|
|
12
|
-
* Env: COMFY_PORT
|
|
12
|
+
* Env: COMFYUI_PORT (or COMFY_PORT, default 8000), COMFYUI_HOST (or COMFY_HOST, default 127.0.0.1),
|
|
13
|
+
* COMFYUI_SSL (default false — set "true" to use https:// + wss://)
|
|
13
14
|
*/
|
|
14
15
|
|
|
15
|
-
const HOST = process.env.COMFY_HOST || "127.0.0.1";
|
|
16
|
-
const PORT = Number(process.env.COMFY_PORT) || 8000;
|
|
16
|
+
const HOST = process.env.COMFYUI_HOST || process.env.COMFY_HOST || "127.0.0.1";
|
|
17
|
+
const PORT = Number(process.env.COMFYUI_PORT || process.env.COMFY_PORT) || 8000;
|
|
18
|
+
const SSL = process.env.COMFYUI_SSL === "true";
|
|
19
|
+
const HTTP_PROTOCOL = SSL ? "https" : "http";
|
|
20
|
+
const WS_PROTOCOL = SSL ? "wss" : "ws";
|
|
17
21
|
const TIMEOUT_MS = 10 * 60 * 1000;
|
|
18
22
|
const THROTTLE_MS = 2000;
|
|
19
23
|
const THROTTLE_PCT = 10;
|
|
@@ -63,7 +67,7 @@ async function fetchJSON(path, timeoutMs = 5000) {
|
|
|
63
67
|
const controller = new AbortController();
|
|
64
68
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
65
69
|
try {
|
|
66
|
-
const res = await fetch(
|
|
70
|
+
const res = await fetch(`${HTTP_PROTOCOL}://${HOST}:${PORT}${path}`, {
|
|
67
71
|
signal: controller.signal,
|
|
68
72
|
});
|
|
69
73
|
clearTimeout(timer);
|
|
@@ -278,7 +282,7 @@ function connectWebSocket() {
|
|
|
278
282
|
// ComfyUI routes progress/executing events only to the WS client whose clientId
|
|
279
283
|
// matches the client_id in the POST /prompt body.
|
|
280
284
|
const ws = new WebSocket(
|
|
281
|
-
|
|
285
|
+
`${WS_PROTOCOL}://${HOST}:${PORT}/ws?clientId=comfyui-mcp`,
|
|
282
286
|
);
|
|
283
287
|
|
|
284
288
|
ws.onopen = () => {
|
package/server.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
|
+
"name": "io.github.artokun/comfyui-mcp",
|
|
4
|
+
"description": "MCP server + Claude Code plugin for ComfyUI: run workflows, generate images, manage models & VRAM.",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/artokun/comfyui-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "0.4.1",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"registryBaseUrl": "https://registry.npmjs.org",
|
|
14
|
+
"identifier": "comfyui-mcp",
|
|
15
|
+
"version": "0.4.1",
|
|
16
|
+
"transport": {
|
|
17
|
+
"type": "stdio"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|