comfyui-mcp 0.1.0

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.
Files changed (90) hide show
  1. package/.mcp.json +11 -0
  2. package/dist/comfyui/client.d.ts +16 -0
  3. package/dist/comfyui/client.d.ts.map +1 -0
  4. package/dist/comfyui/client.js +75 -0
  5. package/dist/comfyui/client.js.map +1 -0
  6. package/dist/comfyui/events.d.ts +9 -0
  7. package/dist/comfyui/events.d.ts.map +1 -0
  8. package/dist/comfyui/events.js +40 -0
  9. package/dist/comfyui/events.js.map +1 -0
  10. package/dist/comfyui/types.d.ts +66 -0
  11. package/dist/comfyui/types.d.ts.map +1 -0
  12. package/dist/comfyui/types.js +3 -0
  13. package/dist/comfyui/types.js.map +1 -0
  14. package/dist/config.d.ts +28 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +93 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +22 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/services/mermaid-converter.d.ts +8 -0
  23. package/dist/services/mermaid-converter.d.ts.map +1 -0
  24. package/dist/services/mermaid-converter.js +235 -0
  25. package/dist/services/mermaid-converter.js.map +1 -0
  26. package/dist/services/mermaid-parser.d.ts +31 -0
  27. package/dist/services/mermaid-parser.d.ts.map +1 -0
  28. package/dist/services/mermaid-parser.js +464 -0
  29. package/dist/services/mermaid-parser.js.map +1 -0
  30. package/dist/services/model-resolver.d.ts +25 -0
  31. package/dist/services/model-resolver.d.ts.map +1 -0
  32. package/dist/services/model-resolver.js +123 -0
  33. package/dist/services/model-resolver.js.map +1 -0
  34. package/dist/services/registry-client.d.ts +28 -0
  35. package/dist/services/registry-client.d.ts.map +1 -0
  36. package/dist/services/registry-client.js +32 -0
  37. package/dist/services/registry-client.js.map +1 -0
  38. package/dist/services/skill-generator.d.ts +33 -0
  39. package/dist/services/skill-generator.d.ts.map +1 -0
  40. package/dist/services/skill-generator.js +438 -0
  41. package/dist/services/skill-generator.js.map +1 -0
  42. package/dist/services/workflow-composer.d.ts +43 -0
  43. package/dist/services/workflow-composer.d.ts.map +1 -0
  44. package/dist/services/workflow-composer.js +333 -0
  45. package/dist/services/workflow-composer.js.map +1 -0
  46. package/dist/services/workflow-executor.d.ts +15 -0
  47. package/dist/services/workflow-executor.d.ts.map +1 -0
  48. package/dist/services/workflow-executor.js +63 -0
  49. package/dist/services/workflow-executor.js.map +1 -0
  50. package/dist/tools/index.d.ts +3 -0
  51. package/dist/tools/index.d.ts.map +1 -0
  52. package/dist/tools/index.js +15 -0
  53. package/dist/tools/index.js.map +1 -0
  54. package/dist/tools/model-management.d.ts +3 -0
  55. package/dist/tools/model-management.d.ts.map +1 -0
  56. package/dist/tools/model-management.js +97 -0
  57. package/dist/tools/model-management.js.map +1 -0
  58. package/dist/tools/registry-search.d.ts +3 -0
  59. package/dist/tools/registry-search.d.ts.map +1 -0
  60. package/dist/tools/registry-search.js +70 -0
  61. package/dist/tools/registry-search.js.map +1 -0
  62. package/dist/tools/skill-generator.d.ts +3 -0
  63. package/dist/tools/skill-generator.d.ts.map +1 -0
  64. package/dist/tools/skill-generator.js +42 -0
  65. package/dist/tools/skill-generator.js.map +1 -0
  66. package/dist/tools/workflow-compose.d.ts +3 -0
  67. package/dist/tools/workflow-compose.d.ts.map +1 -0
  68. package/dist/tools/workflow-compose.js +180 -0
  69. package/dist/tools/workflow-compose.js.map +1 -0
  70. package/dist/tools/workflow-execute.d.ts +3 -0
  71. package/dist/tools/workflow-execute.d.ts.map +1 -0
  72. package/dist/tools/workflow-execute.js +115 -0
  73. package/dist/tools/workflow-execute.js.map +1 -0
  74. package/dist/tools/workflow-visualize.d.ts +3 -0
  75. package/dist/tools/workflow-visualize.d.ts.map +1 -0
  76. package/dist/tools/workflow-visualize.js +111 -0
  77. package/dist/tools/workflow-visualize.js.map +1 -0
  78. package/dist/utils/errors.d.ts +24 -0
  79. package/dist/utils/errors.d.ts.map +1 -0
  80. package/dist/utils/errors.js +65 -0
  81. package/dist/utils/errors.js.map +1 -0
  82. package/dist/utils/image.d.ts +4 -0
  83. package/dist/utils/image.d.ts.map +1 -0
  84. package/dist/utils/image.js +10 -0
  85. package/dist/utils/image.js.map +1 -0
  86. package/dist/utils/logger.d.ts +7 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +22 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/package.json +34 -0
@@ -0,0 +1,333 @@
1
+ import { ValidationError } from "../utils/errors.js";
2
+ // --- Helpers ---
3
+ export function getNextNodeId(workflow) {
4
+ const ids = Object.keys(workflow).map(Number).filter((n) => !Number.isNaN(n));
5
+ return String(ids.length === 0 ? 1 : Math.max(...ids) + 1);
6
+ }
7
+ function conn(nodeId, outputIndex) {
8
+ return [nodeId, outputIndex];
9
+ }
10
+ // --- Templates ---
11
+ function buildTxt2Img(p) {
12
+ const ckpt = p.checkpoint ?? "sd_xl_base_1.0.safetensors";
13
+ const positive = p.positive_prompt ?? "";
14
+ const negative = p.negative_prompt ?? "";
15
+ const width = p.width ?? 1024;
16
+ const height = p.height ?? 1024;
17
+ const steps = p.steps ?? 20;
18
+ const cfg = p.cfg ?? 8.0;
19
+ const seed = p.seed ?? Math.floor(Math.random() * 2 ** 48);
20
+ const sampler = p.sampler_name ?? "euler";
21
+ const scheduler = p.scheduler ?? "normal";
22
+ return {
23
+ "1": {
24
+ class_type: "CheckpointLoaderSimple",
25
+ inputs: { ckpt_name: ckpt },
26
+ },
27
+ "2": {
28
+ class_type: "CLIPTextEncode",
29
+ inputs: { text: positive, clip: conn("1", 1) },
30
+ _meta: { title: "Positive Prompt" },
31
+ },
32
+ "3": {
33
+ class_type: "CLIPTextEncode",
34
+ inputs: { text: negative, clip: conn("1", 1) },
35
+ _meta: { title: "Negative Prompt" },
36
+ },
37
+ "4": {
38
+ class_type: "EmptyLatentImage",
39
+ inputs: { width, height, batch_size: 1 },
40
+ },
41
+ "5": {
42
+ class_type: "KSampler",
43
+ inputs: {
44
+ model: conn("1", 0),
45
+ positive: conn("2", 0),
46
+ negative: conn("3", 0),
47
+ latent_image: conn("4", 0),
48
+ seed,
49
+ steps,
50
+ cfg,
51
+ sampler_name: sampler,
52
+ scheduler,
53
+ denoise: 1.0,
54
+ },
55
+ },
56
+ "6": {
57
+ class_type: "VAEDecode",
58
+ inputs: { samples: conn("5", 0), vae: conn("1", 2) },
59
+ },
60
+ "7": {
61
+ class_type: "SaveImage",
62
+ inputs: { images: conn("6", 0), filename_prefix: "ComfyUI" },
63
+ },
64
+ };
65
+ }
66
+ function buildImg2Img(p) {
67
+ const ckpt = p.checkpoint ?? "sd_xl_base_1.0.safetensors";
68
+ const positive = p.positive_prompt ?? "";
69
+ const negative = p.negative_prompt ?? "";
70
+ const steps = p.steps ?? 20;
71
+ const cfg = p.cfg ?? 8.0;
72
+ const seed = p.seed ?? Math.floor(Math.random() * 2 ** 48);
73
+ const sampler = p.sampler_name ?? "euler";
74
+ const scheduler = p.scheduler ?? "normal";
75
+ const denoise = p.denoise ?? 0.75;
76
+ const imagePath = p.image_path ?? "input.png";
77
+ return {
78
+ "1": {
79
+ class_type: "CheckpointLoaderSimple",
80
+ inputs: { ckpt_name: ckpt },
81
+ },
82
+ "2": {
83
+ class_type: "LoadImage",
84
+ inputs: { image: imagePath },
85
+ },
86
+ "3": {
87
+ class_type: "VAEEncode",
88
+ inputs: { pixels: conn("2", 0), vae: conn("1", 2) },
89
+ },
90
+ "4": {
91
+ class_type: "CLIPTextEncode",
92
+ inputs: { text: positive, clip: conn("1", 1) },
93
+ _meta: { title: "Positive Prompt" },
94
+ },
95
+ "5": {
96
+ class_type: "CLIPTextEncode",
97
+ inputs: { text: negative, clip: conn("1", 1) },
98
+ _meta: { title: "Negative Prompt" },
99
+ },
100
+ "6": {
101
+ class_type: "KSampler",
102
+ inputs: {
103
+ model: conn("1", 0),
104
+ positive: conn("4", 0),
105
+ negative: conn("5", 0),
106
+ latent_image: conn("3", 0),
107
+ seed,
108
+ steps,
109
+ cfg,
110
+ sampler_name: sampler,
111
+ scheduler,
112
+ denoise,
113
+ },
114
+ },
115
+ "7": {
116
+ class_type: "VAEDecode",
117
+ inputs: { samples: conn("6", 0), vae: conn("1", 2) },
118
+ },
119
+ "8": {
120
+ class_type: "SaveImage",
121
+ inputs: { images: conn("7", 0), filename_prefix: "ComfyUI" },
122
+ },
123
+ };
124
+ }
125
+ function buildUpscale(p) {
126
+ const model = p.upscale_model ?? "RealESRGAN_x4plus.pth";
127
+ const imagePath = p.image_path ?? "input.png";
128
+ return {
129
+ "1": {
130
+ class_type: "LoadImage",
131
+ inputs: { image: imagePath },
132
+ },
133
+ "2": {
134
+ class_type: "UpscaleModelLoader",
135
+ inputs: { model_name: model },
136
+ },
137
+ "3": {
138
+ class_type: "ImageUpscaleWithModel",
139
+ inputs: { upscale_model: conn("2", 0), image: conn("1", 0) },
140
+ },
141
+ "4": {
142
+ class_type: "SaveImage",
143
+ inputs: { images: conn("3", 0), filename_prefix: "ComfyUI_upscale" },
144
+ },
145
+ };
146
+ }
147
+ function buildInpaint(p) {
148
+ const ckpt = p.checkpoint ?? "sd_xl_base_1.0.safetensors";
149
+ const positive = p.positive_prompt ?? "";
150
+ const negative = p.negative_prompt ?? "";
151
+ const steps = p.steps ?? 20;
152
+ const cfg = p.cfg ?? 8.0;
153
+ const seed = p.seed ?? Math.floor(Math.random() * 2 ** 48);
154
+ const sampler = p.sampler_name ?? "euler";
155
+ const scheduler = p.scheduler ?? "normal";
156
+ const denoise = p.denoise ?? 0.85;
157
+ const imagePath = p.image_path ?? "input.png";
158
+ const maskPath = p.mask_path ?? "mask.png";
159
+ return {
160
+ "1": {
161
+ class_type: "CheckpointLoaderSimple",
162
+ inputs: { ckpt_name: ckpt },
163
+ },
164
+ "2": {
165
+ class_type: "LoadImage",
166
+ inputs: { image: imagePath },
167
+ _meta: { title: "Input Image" },
168
+ },
169
+ "3": {
170
+ class_type: "LoadImage",
171
+ inputs: { image: maskPath },
172
+ _meta: { title: "Mask" },
173
+ },
174
+ "4": {
175
+ class_type: "VAEEncode",
176
+ inputs: { pixels: conn("2", 0), vae: conn("1", 2) },
177
+ },
178
+ "5": {
179
+ class_type: "SetLatentNoiseMask",
180
+ inputs: { samples: conn("4", 0), mask: conn("3", 1) },
181
+ },
182
+ "6": {
183
+ class_type: "CLIPTextEncode",
184
+ inputs: { text: positive, clip: conn("1", 1) },
185
+ _meta: { title: "Positive Prompt" },
186
+ },
187
+ "7": {
188
+ class_type: "CLIPTextEncode",
189
+ inputs: { text: negative, clip: conn("1", 1) },
190
+ _meta: { title: "Negative Prompt" },
191
+ },
192
+ "8": {
193
+ class_type: "KSampler",
194
+ inputs: {
195
+ model: conn("1", 0),
196
+ positive: conn("6", 0),
197
+ negative: conn("7", 0),
198
+ latent_image: conn("5", 0),
199
+ seed,
200
+ steps,
201
+ cfg,
202
+ sampler_name: sampler,
203
+ scheduler,
204
+ denoise,
205
+ },
206
+ },
207
+ "9": {
208
+ class_type: "VAEDecode",
209
+ inputs: { samples: conn("8", 0), vae: conn("1", 2) },
210
+ },
211
+ "10": {
212
+ class_type: "SaveImage",
213
+ inputs: { images: conn("9", 0), filename_prefix: "ComfyUI_inpaint" },
214
+ },
215
+ };
216
+ }
217
+ const TEMPLATES = {
218
+ txt2img: (p) => buildTxt2Img(p),
219
+ img2img: (p) => buildImg2Img(p),
220
+ upscale: (p) => buildUpscale(p),
221
+ inpaint: (p) => buildInpaint(p),
222
+ };
223
+ export const TEMPLATE_NAMES = Object.keys(TEMPLATES);
224
+ export function createWorkflow(template, params = {}) {
225
+ const builder = TEMPLATES[template];
226
+ if (!builder) {
227
+ throw new ValidationError(`Unknown template "${template}". Available: ${TEMPLATE_NAMES.join(", ")}`);
228
+ }
229
+ return builder(params);
230
+ }
231
+ function applySetInput(wf, op) {
232
+ const node = wf[op.node_id];
233
+ if (!node)
234
+ throw new ValidationError(`Node "${op.node_id}" not found`);
235
+ node.inputs[op.input_name] = op.value;
236
+ }
237
+ function applyAddNode(wf, op) {
238
+ const id = op.id ?? getNextNodeId(wf);
239
+ if (wf[id])
240
+ throw new ValidationError(`Node ID "${id}" already exists`);
241
+ wf[id] = {
242
+ class_type: op.class_type,
243
+ inputs: op.inputs ?? {},
244
+ };
245
+ return id;
246
+ }
247
+ function applyRemoveNode(wf, op) {
248
+ if (!wf[op.node_id])
249
+ throw new ValidationError(`Node "${op.node_id}" not found`);
250
+ delete wf[op.node_id];
251
+ // Clean up any connections pointing to the removed node
252
+ for (const node of Object.values(wf)) {
253
+ for (const [key, val] of Object.entries(node.inputs)) {
254
+ if (Array.isArray(val) &&
255
+ val.length === 2 &&
256
+ typeof val[0] === "string" &&
257
+ val[0] === op.node_id) {
258
+ delete node.inputs[key];
259
+ }
260
+ }
261
+ }
262
+ }
263
+ function applyConnect(wf, op) {
264
+ if (!wf[op.source_id])
265
+ throw new ValidationError(`Source node "${op.source_id}" not found`);
266
+ if (!wf[op.target_id])
267
+ throw new ValidationError(`Target node "${op.target_id}" not found`);
268
+ wf[op.target_id].inputs[op.input_name] = [op.source_id, op.output_index];
269
+ }
270
+ function applyInsertBetween(wf, op) {
271
+ if (!wf[op.source_id])
272
+ throw new ValidationError(`Source node "${op.source_id}" not found`);
273
+ if (!wf[op.target_id])
274
+ throw new ValidationError(`Target node "${op.target_id}" not found`);
275
+ const newId = getNextNodeId(wf);
276
+ const newInputs = { ...(op.new_inputs ?? {}) };
277
+ // Connect the new node's first input to the original source
278
+ // Find the first input name that isn't already set -- use a convention-based approach
279
+ // The new node receives the source output on its primary input
280
+ // We'll figure out the right input name by looking for common patterns
281
+ const primaryInputNames = ["model", "clip", "samples", "latent_image", "image", "conditioning", "pixels"];
282
+ let connected = false;
283
+ for (const name of primaryInputNames) {
284
+ if (!(name in newInputs)) {
285
+ newInputs[name] = [op.source_id, op.output_index];
286
+ connected = true;
287
+ break;
288
+ }
289
+ }
290
+ if (!connected) {
291
+ // Fallback: add as first unused slot
292
+ newInputs["input"] = [op.source_id, op.output_index];
293
+ }
294
+ wf[newId] = {
295
+ class_type: op.new_class_type,
296
+ inputs: newInputs,
297
+ };
298
+ // Rewire: target's input now points to the new node's output 0
299
+ wf[op.target_id].inputs[op.input_name] = [newId, 0];
300
+ return newId;
301
+ }
302
+ export function modifyWorkflow(workflow, operations) {
303
+ // Deep clone to avoid mutating the original
304
+ const wf = JSON.parse(JSON.stringify(workflow));
305
+ const addedIds = [];
306
+ for (const op of operations) {
307
+ switch (op.op) {
308
+ case "set_input":
309
+ applySetInput(wf, op);
310
+ break;
311
+ case "add_node": {
312
+ const id = applyAddNode(wf, op);
313
+ addedIds.push(id);
314
+ break;
315
+ }
316
+ case "remove_node":
317
+ applyRemoveNode(wf, op);
318
+ break;
319
+ case "connect":
320
+ applyConnect(wf, op);
321
+ break;
322
+ case "insert_between": {
323
+ const id = applyInsertBetween(wf, op);
324
+ addedIds.push(id);
325
+ break;
326
+ }
327
+ default:
328
+ throw new ValidationError(`Unknown operation: ${op.op}`);
329
+ }
330
+ }
331
+ return { workflow: wf, added_ids: addedIds };
332
+ }
333
+ //# sourceMappingURL=workflow-composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-composer.js","sourceRoot":"","sources":["../../src/services/workflow-composer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { WorkflowJSON, SystemStats, QueueStatus, JobResult } from "../comfyui/types.js";
2
+ export interface ExecuteWorkflowOptions {
3
+ timeout_ms?: number;
4
+ disable_random_seed?: boolean;
5
+ }
6
+ export declare function executeWorkflow(workflowJson: WorkflowJSON, options?: ExecuteWorkflowOptions): Promise<JobResult>;
7
+ export declare function getJobStatus(promptId: string): Promise<{
8
+ running: boolean;
9
+ pending: boolean;
10
+ done: boolean;
11
+ }>;
12
+ export declare function getQueueStatus(): Promise<QueueStatus>;
13
+ export declare function cancelCurrentJob(): Promise<void>;
14
+ export declare function getSystemInfo(): Promise<SystemStats>;
15
+ //# sourceMappingURL=workflow-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-executor.d.ts","sourceRoot":"","sources":["../../src/services/workflow-executor.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,EACV,MAAM,qBAAqB,CAAC;AAK7B,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAsB,eAAe,CACnC,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,SAAS,CAAC,CAsDpB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAGhE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAE3D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGtD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CAE1D"}
@@ -0,0 +1,63 @@
1
+ import { getClient, connectClient, getSystemStats as clientGetSystemStats, getQueue as clientGetQueue, interrupt as clientInterrupt, } from "../comfyui/client.js";
2
+ import { WorkflowExecutionError, ConnectionError } from "../utils/errors.js";
3
+ import { arrayBufferToBase64 } from "../utils/image.js";
4
+ import { logger } from "../utils/logger.js";
5
+ export async function executeWorkflow(workflowJson, options) {
6
+ const client = getClient();
7
+ // Ensure WebSocket is connected for enqueue (uses WS internally)
8
+ try {
9
+ await connectClient();
10
+ }
11
+ catch (err) {
12
+ if (err instanceof ConnectionError)
13
+ throw err;
14
+ throw new ConnectionError(`Failed to connect: ${err instanceof Error ? err.message : err}`);
15
+ }
16
+ logger.info("Enqueueing workflow for execution");
17
+ try {
18
+ const result = await client.enqueue(workflowJson, {
19
+ timeout_ms: options?.timeout_ms ?? 10 * 60 * 1000,
20
+ disable_random_seed: options?.disable_random_seed,
21
+ progress: (p) => {
22
+ logger.debug("Execution progress", {
23
+ value: p.value,
24
+ max: p.max,
25
+ });
26
+ },
27
+ });
28
+ const images = result.images
29
+ .filter((img) => img.type === "buff")
30
+ .map((img) => ({
31
+ data: arrayBufferToBase64(img.data),
32
+ mime: img.mime,
33
+ }));
34
+ logger.info("Workflow execution completed", {
35
+ prompt_id: result.prompt_id,
36
+ image_count: images.length,
37
+ });
38
+ return {
39
+ prompt_id: result.prompt_id,
40
+ images,
41
+ node_outputs: {},
42
+ };
43
+ }
44
+ catch (err) {
45
+ const message = err instanceof Error ? err.message : String(err);
46
+ throw new WorkflowExecutionError(`Workflow execution failed: ${message}`);
47
+ }
48
+ }
49
+ export async function getJobStatus(promptId) {
50
+ const client = getClient();
51
+ return client.getPromptStatus(promptId);
52
+ }
53
+ export async function getQueueStatus() {
54
+ return clientGetQueue();
55
+ }
56
+ export async function cancelCurrentJob() {
57
+ await clientInterrupt();
58
+ logger.info("Current job interrupted");
59
+ }
60
+ export async function getSystemInfo() {
61
+ return clientGetSystemStats();
62
+ }
63
+ //# sourceMappingURL=workflow-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-executor.js","sourceRoot":"","sources":["../../src/services/workflow-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAllTools(server: McpServer): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AAQzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAOxD"}
@@ -0,0 +1,15 @@
1
+ import { registerWorkflowExecuteTools } from "./workflow-execute.js";
2
+ import { registerWorkflowVisualizeTools } from "./workflow-visualize.js";
3
+ import { registerWorkflowComposeTools } from "./workflow-compose.js";
4
+ import { registerRegistrySearchTools } from "./registry-search.js";
5
+ import { registerModelManagementTools } from "./model-management.js";
6
+ import { registerSkillGeneratorTools } from "./skill-generator.js";
7
+ export function registerAllTools(server) {
8
+ registerWorkflowExecuteTools(server);
9
+ registerWorkflowVisualizeTools(server);
10
+ registerWorkflowComposeTools(server);
11
+ registerRegistrySearchTools(server);
12
+ registerModelManagementTools(server);
13
+ registerSkillGeneratorTools(server);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerModelManagementTools(server: McpServer): void;
3
+ //# sourceMappingURL=model-management.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-management.d.ts","sourceRoot":"","sources":["../../src/tools/model-management.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2HpE"}
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ import { searchHuggingFaceModels, listLocalModels, downloadModel, MODEL_SUBDIRS, } from "../services/model-resolver.js";
3
+ import { errorToToolResult } from "../utils/errors.js";
4
+ const modelTypeEnum = z.enum(MODEL_SUBDIRS);
5
+ export function registerModelManagementTools(server) {
6
+ server.tool("search_models", "Search HuggingFace for models compatible with ComfyUI (checkpoints, LoRAs, VAEs, etc.)", {
7
+ query: z.string().describe("Search query (e.g. 'SDXL', 'flux', 'controlnet')"),
8
+ filter: z
9
+ .string()
10
+ .optional()
11
+ .describe("HuggingFace tag filter (e.g. 'diffusers', 'text-to-image')"),
12
+ limit: z
13
+ .number()
14
+ .int()
15
+ .min(1)
16
+ .max(50)
17
+ .optional()
18
+ .describe("Max results to return (default 10)"),
19
+ }, async (args) => {
20
+ try {
21
+ const results = await searchHuggingFaceModels(args.query, {
22
+ filter: args.filter,
23
+ limit: args.limit,
24
+ });
25
+ const text = results.length === 0
26
+ ? `No models found for "${args.query}".`
27
+ : results
28
+ .map((m, i) => `${i + 1}. **${m.modelId}** by ${m.author || "unknown"}\n` +
29
+ ` Downloads: ${m.downloads.toLocaleString()} | Likes: ${m.likes}\n` +
30
+ ` Tags: ${m.tags.slice(0, 5).join(", ") || "none"}`)
31
+ .join("\n\n");
32
+ return { content: [{ type: "text", text }] };
33
+ }
34
+ catch (err) {
35
+ return errorToToolResult(err);
36
+ }
37
+ });
38
+ server.tool("download_model", "Download a model file to the ComfyUI models directory from a URL (HuggingFace or direct link)", {
39
+ url: z.string().url().describe("Direct download URL for the model file"),
40
+ target_subfolder: modelTypeEnum.describe("Target subfolder under ComfyUI models/ (e.g. 'checkpoints', 'loras', 'vae')"),
41
+ filename: z
42
+ .string()
43
+ .optional()
44
+ .describe("Override filename (auto-detected from URL if omitted)"),
45
+ }, async (args) => {
46
+ try {
47
+ const savedPath = await downloadModel(args.url, args.target_subfolder, args.filename);
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: `Model downloaded successfully to:\n${savedPath}`,
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (err) {
58
+ return errorToToolResult(err);
59
+ }
60
+ });
61
+ server.tool("list_local_models", "List model files installed in the local ComfyUI models directory", {
62
+ model_type: modelTypeEnum
63
+ .optional()
64
+ .describe("Filter by model type (e.g. 'checkpoints', 'loras'). Lists all types if omitted."),
65
+ }, async (args) => {
66
+ try {
67
+ const models = await listLocalModels(args.model_type);
68
+ if (models.length === 0) {
69
+ const scope = args.model_type
70
+ ? `No ${args.model_type} models found.`
71
+ : "No local models found.";
72
+ return { content: [{ type: "text", text: scope }] };
73
+ }
74
+ // Group by type
75
+ const grouped = new Map();
76
+ for (const m of models) {
77
+ const list = grouped.get(m.type) ?? [];
78
+ list.push(m);
79
+ grouped.set(m.type, list);
80
+ }
81
+ const lines = [];
82
+ for (const [type, list] of grouped) {
83
+ lines.push(`## ${type} (${list.length})`);
84
+ for (const m of list) {
85
+ const sizeMB = (m.size / 1024 / 1024).toFixed(1);
86
+ lines.push(`- ${m.name} (${sizeMB} MB) — modified ${m.modified}`);
87
+ }
88
+ lines.push("");
89
+ }
90
+ return { content: [{ type: "text", text: lines.join("\n") }] };
91
+ }
92
+ catch (err) {
93
+ return errorToToolResult(err);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=model-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-management.js","sourceRoot":"","sources":["../../src/tools/model-management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerRegistrySearchTools(server: McpServer): void;
3
+ //# sourceMappingURL=registry-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-search.d.ts","sourceRoot":"","sources":["../../src/tools/registry-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyFnE"}