comfyui-mcp 0.23.4 → 0.24.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.
@@ -47,57 +47,84 @@ import { registerSkillsAccessTools } from "./skills-access.js";
47
47
  import { registerInstallPanelTools } from "./install-panel.js";
48
48
  import { registerSelfUpdateTools } from "./self-update.js";
49
49
  import { DefaultsManager } from "../services/defaults-manager.js";
50
+ import { ToolCatalog } from "./catalog.js";
51
+ /**
52
+ * Every static tool group, in registration order (order is observable in
53
+ * tools/list, so it must not change), tagged with the category used by the
54
+ * compact tool mode's list_tools manifest.
55
+ */
56
+ const TOOL_GROUPS = [
57
+ ["workflows", registerWorkflowExecuteTools],
58
+ ["workflow-authoring", registerWorkflowVisualizeTools],
59
+ ["workflow-authoring", registerWorkflowComposeTools],
60
+ ["workflow-authoring", registerWorkflowValidateTools],
61
+ ["workflows", registerQueueManagementTools],
62
+ ["custom-nodes", registerRegistrySearchTools],
63
+ ["models", registerModelManagementTools],
64
+ ["skills-config", registerSkillGeneratorTools],
65
+ ["diagnostics", registerDiagnosticsTools],
66
+ ["workflow-authoring", registerWorkflowLibraryTools],
67
+ ["workflows", registerWorkflowUrlTools],
68
+ ["server", registerProcessControlTools],
69
+ ["images-assets", registerImageManagementTools],
70
+ ["server", registerMemoryManagementTools],
71
+ ["generation", registerGenerationTrackerTools],
72
+ ["images-assets", registerAssetTools],
73
+ ["skills-config", registerDefaultsTools],
74
+ ["generation", registerGenerateImageTool],
75
+ ["generation", registerGenerateAudioTool],
76
+ ["generation", registerGenerateVideoTool],
77
+ ["generation", registerRemoveBackgroundTool],
78
+ ["generation", registerUpscaleImageTool],
79
+ ["generation", registerConditionedGenerationTools],
80
+ ["workflow-authoring", registerWorkflowDslTools],
81
+ ["custom-nodes", registerNodeSnapshotsTools],
82
+ ["custom-nodes", registerNodeBisectTools],
83
+ ["custom-nodes", registerNodeManagementTools],
84
+ ["diagnostics", registerReportIssueTools],
85
+ ["workflows", registerWorkflowDepsTools],
86
+ ["server", registerInstallComfyUITools],
87
+ ["server", registerUpdateComfyUITools],
88
+ ["models", registerModelExtrasTools],
89
+ ["models", registerExtraPathsTools],
90
+ ["server", registerWorkspaceEnvTools],
91
+ ["generation", registerApiNodesTools],
92
+ ["server", registerManagerConfigTools],
93
+ ["custom-nodes", registerNodeAuthoringTools],
94
+ ["custom-nodes", registerNodeVerifyTools],
95
+ ["models", registerManifestTools],
96
+ ["images-assets", registerImageConvertTools],
97
+ ["images-assets", registerColorAnalysisTools],
98
+ ["images-assets", registerStorageUploadTools],
99
+ ["diagnostics", registerHealthCheckTools],
100
+ ["workflow-authoring", registerWorkflowLockTools],
101
+ ["skills-config", registerSkillsAccessTools],
102
+ ["server", registerInstallPanelTools],
103
+ ["server", registerSelfUpdateTools],
104
+ ];
50
105
  export async function registerAllTools(server) {
51
106
  // Hydrate persisted defaults before any tool registration so subsequent
52
107
  // tools can consult DefaultsManager.apply() against a fully-resolved view.
53
108
  await DefaultsManager.load();
54
- registerWorkflowExecuteTools(server);
55
- registerWorkflowVisualizeTools(server);
56
- registerWorkflowComposeTools(server);
57
- registerWorkflowValidateTools(server);
58
- registerQueueManagementTools(server);
59
- registerRegistrySearchTools(server);
60
- registerModelManagementTools(server);
61
- registerSkillGeneratorTools(server);
62
- registerDiagnosticsTools(server);
63
- registerWorkflowLibraryTools(server);
64
- registerWorkflowUrlTools(server);
65
- registerProcessControlTools(server);
66
- registerImageManagementTools(server);
67
- registerMemoryManagementTools(server);
68
- registerGenerationTrackerTools(server);
69
- registerAssetTools(server);
70
- registerDefaultsTools(server);
71
- registerGenerateImageTool(server);
72
- registerGenerateAudioTool(server);
73
- registerGenerateVideoTool(server);
74
- registerRemoveBackgroundTool(server);
75
- registerUpscaleImageTool(server);
76
- registerConditionedGenerationTools(server);
77
- registerWorkflowDslTools(server);
78
- registerNodeSnapshotsTools(server);
79
- registerNodeBisectTools(server);
80
- registerNodeManagementTools(server);
81
- registerReportIssueTools(server);
82
- registerWorkflowDepsTools(server);
83
- registerInstallComfyUITools(server);
84
- registerUpdateComfyUITools(server);
85
- registerModelExtrasTools(server);
86
- registerExtraPathsTools(server);
87
- registerWorkspaceEnvTools(server);
88
- registerApiNodesTools(server);
89
- registerManagerConfigTools(server);
90
- registerNodeAuthoringTools(server);
91
- registerNodeVerifyTools(server);
92
- registerManifestTools(server);
93
- registerImageConvertTools(server);
94
- registerColorAnalysisTools(server);
95
- registerStorageUploadTools(server);
96
- registerHealthCheckTools(server);
97
- registerWorkflowLockTools(server);
98
- registerSkillsAccessTools(server);
99
- registerInstallPanelTools(server);
100
- registerSelfUpdateTools(server);
109
+ for (const [, register] of TOOL_GROUPS)
110
+ register(server);
101
111
  await registerAutoloadedWorkflows(server);
102
112
  }
113
+ /**
114
+ * Run the same registration pass against a capturing ToolCatalog instead of a
115
+ * live server. Used by the compact tool mode (small/local LLMs): the catalog
116
+ * backs the list_tools / describe_tool / call_tool meta-tools.
117
+ */
118
+ export async function collectToolCatalog() {
119
+ await DefaultsManager.load();
120
+ const catalog = new ToolCatalog();
121
+ const registrar = catalog.asRegistrar();
122
+ for (const [category, register] of TOOL_GROUPS) {
123
+ catalog.setCategory(category);
124
+ register(registrar);
125
+ }
126
+ catalog.setCategory("saved-workflows");
127
+ await registerAutoloadedWorkflows(registrar);
128
+ return catalog;
129
+ }
103
130
  //# sourceMappingURL=index.js.map
@@ -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,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,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,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,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,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,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,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,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,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,kCAAkC,CAAC,MAAM,CAAC,CAAC;IAC3C,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ const DEFAULT_PORT = 9100;
11
11
  export function parseCliArgs(argv, env = process.env) {
12
12
  const args = argv.slice(2);
13
13
  let transport = env.MCP_TRANSPORT === "http" ? "http" : "stdio";
14
+ let toolMode = env.COMFYUI_MCP_TOOL_MODE === "compact" ? "compact" : "full";
14
15
  let host = env.MCP_HOST ?? DEFAULT_HOST;
15
16
  let port = env.MCP_PORT ? Number(env.MCP_PORT) : DEFAULT_PORT;
16
17
  let panelOrchestrator = env.COMFYUI_MCP_PANEL_ORCHESTRATOR === "1" ||
@@ -20,6 +21,9 @@ export function parseCliArgs(argv, env = process.env) {
20
21
  let allowUnauthenticated = env.COMFYUI_MCP_ALLOW_UNAUTH === "1" || env.COMFYUI_MCP_ALLOW_UNAUTH === "true";
21
22
  let insecureBridge = env.COMFYUI_MCP_INSECURE_BRIDGE === "1" || env.COMFYUI_MCP_INSECURE_BRIDGE === "true";
22
23
  let comfyuiUrl;
24
+ let setupAgent;
25
+ let setupDryRun = false;
26
+ let toolModeExplicit = env.COMFYUI_MCP_TOOL_MODE === "compact";
23
27
  const valueOf = (current, inline, i) => {
24
28
  if (current.includes("="))
25
29
  return [current.slice(current.indexOf("=") + 1), i];
@@ -81,6 +85,43 @@ export function parseCliArgs(argv, env = process.env) {
81
85
  else if (a === "--insecure-bridge") {
82
86
  insecureBridge = true;
83
87
  }
88
+ else if (a === "--compact") {
89
+ toolMode = "compact";
90
+ toolModeExplicit = true;
91
+ }
92
+ else if (a === "--full") {
93
+ toolMode = "full";
94
+ toolModeExplicit = true;
95
+ }
96
+ else if (a === "--tool-mode" || a.startsWith("--tool-mode=")) {
97
+ const [v, ni] = valueOf(a, "--tool-mode", i);
98
+ toolMode = v === "compact" ? "compact" : "full";
99
+ toolModeExplicit = true;
100
+ i = ni;
101
+ }
102
+ else if (a === "setup") {
103
+ // `comfyui-mcp setup <agent>` — write the comfyui MCP entry into a
104
+ // non-Claude harness's config (hermes | openclaw | copilot) and exit.
105
+ const next = args[i + 1];
106
+ if (next && !next.startsWith("-")) {
107
+ setupAgent = next;
108
+ i += 1;
109
+ }
110
+ else {
111
+ setupAgent = ""; // present but missing the agent → index.ts prints usage
112
+ }
113
+ }
114
+ else if (a === "--dry-run") {
115
+ setupDryRun = true;
116
+ }
117
+ else if (a === "--comfyui-url" || a.startsWith("--comfyui-url=")) {
118
+ // Also parsed by config.ts for the server itself; captured here so
119
+ // `setup` can embed it into the generated harness config.
120
+ const [v, ni] = valueOf(a, "--comfyui-url", i);
121
+ if (v)
122
+ comfyuiUrl = v;
123
+ i = ni;
124
+ }
84
125
  }
85
126
  // --tunnel implies the HTTP transport: a cloudflared quick tunnel needs an
86
127
  // HTTP origin to point at. (Token auto-generation happens at startup, not
@@ -89,6 +130,8 @@ export function parseCliArgs(argv, env = process.env) {
89
130
  transport = "http";
90
131
  return {
91
132
  transport,
133
+ toolMode,
134
+ toolModeExplicit,
92
135
  host,
93
136
  port,
94
137
  panelOrchestrator,
@@ -97,6 +140,8 @@ export function parseCliArgs(argv, env = process.env) {
97
140
  allowUnauthenticated,
98
141
  comfyuiUrl,
99
142
  insecureBridge,
143
+ setupAgent,
144
+ setupDryRun,
100
145
  };
101
146
  }
102
147
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/transport/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/transport/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAoDnD,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAc,EACd,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,SAAS,GAAkB,GAAG,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/E,IAAI,QAAQ,GAAa,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACtF,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,YAAY,CAAC;IACxC,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAC9D,IAAI,iBAAiB,GACnB,GAAG,CAAC,8BAA8B,KAAK,GAAG;QAC1C,GAAG,CAAC,8BAA8B,KAAK,MAAM,CAAC;IAChD,IAAI,KAAK,GAAG,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC5D,IAAI,MAAM,GAAG,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,MAAM,CAAC;IACjE,IAAI,oBAAoB,GACtB,GAAG,CAAC,wBAAwB,KAAK,GAAG,IAAI,GAAG,CAAC,wBAAwB,KAAK,MAAM,CAAC;IAClF,IAAI,cAAc,GAChB,GAAG,CAAC,2BAA2B,KAAK,GAAG,IAAI,GAAG,CAAC,2BAA2B,KAAK,MAAM,CAAC;IACxF,IAAI,UAA8B,CAAC;IACnC,IAAI,UAA8B,CAAC;IACnC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,gBAAgB,GAAG,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC;IAE/D,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,MAAc,EAAE,CAAS,EAAoB,EAAE;QAC/E,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,2EAA2E;YAC3E,yEAAyE;YACzE,yEAAyE;YACzE,2EAA2E;YAC3E,0EAA0E;YAC1E,iBAAiB,GAAG,IAAI,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,UAAU,GAAG,IAAI,CAAC;gBAClB,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;YAClC,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,SAAS,GAAG,MAAM,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAC7C,SAAS,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5C,CAAC,GAAG,EAAE,CAAC;QACT,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC;YAChB,CAAC,GAAG,EAAE,CAAC;QACT,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC;gBAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC,GAAG,EAAE,CAAC;QACT,CAAC;aAAM,IAAI,CAAC,KAAK,sBAAsB,EAAE,CAAC;YACxC,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC;gBAAE,KAAK,GAAG,CAAC,CAAC;YACjB,CAAC,GAAG,EAAE,CAAC;QACT,CAAC;aAAM,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;aAAM,IAAI,CAAC,KAAK,sCAAsC,EAAE,CAAC;YACxD,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,KAAK,mBAAmB,EAAE,CAAC;YACrC,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;YAC7B,QAAQ,GAAG,SAAS,CAAC;YACrB,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,QAAQ,GAAG,MAAM,CAAC;YAClB,gBAAgB,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAC7C,QAAQ,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YAChD,gBAAgB,GAAG,IAAI,CAAC;YACxB,CAAC,GAAG,EAAE,CAAC;QACT,CAAC;aAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;YACzB,mEAAmE;YACnE,sEAAsE;YACtE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,UAAU,GAAG,IAAI,CAAC;gBAClB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,EAAE,CAAC,CAAC,wDAAwD;YAC3E,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;YAC7B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnE,mEAAmE;YACnE,0DAA0D;YAC1D,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC;gBAAE,UAAU,GAAG,CAAC,CAAC;YACtB,CAAC,GAAG,EAAE,CAAC;QACT,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,oDAAoD;IACpD,IAAI,MAAM;QAAE,SAAS,GAAG,MAAM,CAAC;IAE/B,OAAO;QACL,SAAS;QACT,QAAQ;QACR,gBAAgB;QAChB,IAAI;QACJ,IAAI;QACJ,iBAAiB;QACjB,KAAK;QACL,MAAM;QACN,oBAAoB;QACpB,UAAU;QACV,cAAc;QACd,UAAU;QACV,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,eAAe,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,CACL,+CAA+C,GAAG,MAAM,MAAM,KAAK;YACnE,4FAA4F,CAC7F,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "comfyui-mcp",
3
- "version": "0.23.4",
3
+ "version": "0.24.0",
4
4
  "mcpName": "io.github.artokun/comfyui-mcp",
5
- "description": "Local-first, agent-native control plane for ComfyUI — MCP server + autonomous AI agent that drives your live graph in natural language from a sidebar agent on Claude OR ChatGPT (your own subscription, no API key). Generate images, video & audio, author and run workflows, manage models and custom nodes. Also a Claude Code plugin with skills, slash commands, and installer packs. Local, LAN, VPS, or Comfy Cloud.",
5
+ "description": "Local-first, agent-native control plane for ComfyUI — MCP server + autonomous sidebar agent that drives your live graph in natural language on ANY LLM: Claude/ChatGPT/Gemini on your subscription (no API key), free local models via Ollama (fully offline), or any hosted model via an OpenAI-compatible endpoint (DeepSeek, GLM, MiMo, OpenRouter). Generate images, video & audio, author and run workflows, manage models and custom nodes; a compact tool-router mode keeps even 4B models effective, and a built-in LLM Arena benchmarks them on real ComfyUI tasks. Also a Claude Code plugin with skills, slash commands, and installer packs. Local, LAN, VPS, or Comfy Cloud.",
6
6
  "homepage": "https://comfyui-mcp.artokun.io/docs",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",
@@ -28,6 +28,9 @@
28
28
  "test:watch": "vitest",
29
29
  "test:integration": "cross-env COMFYUI_INTEGRATION=true vitest run",
30
30
  "test:agent": "npm run build && node scripts/test-agent.mjs",
31
+ "test:local-llm": "npm run build && node scripts/test-local-llm.mjs",
32
+ "arena": "npm run build && node scripts/llm-arena.mjs",
33
+ "smoke:panel": "npm run build && node scripts/panel-smoke.mjs",
31
34
  "lint": "tsc --noEmit",
32
35
  "docs:gen": "cross-env COMFYUI_URL=http://127.0.0.1:8188 tsx scripts/gen-tool-docs.ts",
33
36
  "packs:gen": "node scripts/gen-pack-installers.mjs",
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ // Fold extra arena run dirs into the main results as BEST-OF-N per model.
3
+ //
4
+ // node scripts/arena-bestof.mjs arena-results arena-results/bo3-run2 arena-results/bo3-run3
5
+ //
6
+ // For every model present in an extra dir, the better run (score, then fewer
7
+ // nudges → rounds → seconds) replaces the main entry, and runs.totals records
8
+ // every observed total so reports can show the range (e.g. "best of 3, 19–20").
9
+ // Regenerates arena-report.md afterward.
10
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+
13
+ const [baseDir, ...runDirs] = process.argv.slice(2);
14
+ if (!baseDir) {
15
+ console.error("usage: arena-bestof.mjs <base-results-dir> [extra-run-dir...] (no dirs = re-sort + regenerate only)");
16
+ process.exit(1);
17
+ }
18
+
19
+ const nudgesOf = (m) => m.results.reduce((s, r) => s + (r.nudges ?? 0), 0);
20
+ const roundsOf = (m) => m.results.reduce((s, r) => s + (r.rounds ?? 0), 0);
21
+ const secondsOf = (m) => m.results.reduce((s, r) => s + (r.seconds ?? 0), 0);
22
+ const better = (a, b) =>
23
+ b.total - a.total || nudgesOf(a) - nudgesOf(b) || roundsOf(a) - roundsOf(b) || secondsOf(a) - secondsOf(b);
24
+
25
+ const basePath = join(baseDir, "arena-results.json");
26
+ const base = JSON.parse(readFileSync(basePath, "utf8"));
27
+
28
+ for (const dir of runDirs) {
29
+ const p = join(dir, "arena-results.json");
30
+ if (!existsSync(p)) {
31
+ console.warn(`skip ${p} (missing)`);
32
+ continue;
33
+ }
34
+ const extra = JSON.parse(readFileSync(p, "utf8"));
35
+ for (const candidate of extra.leaderboard ?? []) {
36
+ const i = base.leaderboard.findIndex((m) => m.model === candidate.model);
37
+ if (i < 0) continue;
38
+ const current = base.leaderboard[i];
39
+ const totals = [...(current.runs?.totals ?? [current.total]), candidate.total];
40
+ const winner = better(current, candidate) > 0 ? candidate : current;
41
+ base.leaderboard[i] = { ...winner, tier: current.tier, runs: { totals } };
42
+ console.log(`${candidate.model}: run=${candidate.total} → keeping ${winner.total} (all: ${totals.join(", ")})`);
43
+ }
44
+ }
45
+
46
+ // Rank: best total, then CONSISTENCY (worst run across best-of-N — a model
47
+ // that is perfect every time outranks one that peaked once), then efficiency.
48
+ const worstRun = (m) => Math.min(...(m.runs?.totals ?? [m.total]));
49
+ base.leaderboard.sort(
50
+ (a, b) =>
51
+ b.total - a.total ||
52
+ worstRun(b) - worstRun(a) ||
53
+ nudgesOf(a) - nudgesOf(b) ||
54
+ roundsOf(a) - roundsOf(b) ||
55
+ secondsOf(a) - secondsOf(b),
56
+ );
57
+ writeFileSync(basePath, JSON.stringify(base, null, 2));
58
+
59
+ // regenerate the share-ready markdown (kept in sync with llm-arena.mjs)
60
+ const icon = { 2: "✅", 1: "🟡", 0: "❌" };
61
+ const scen = base.scenarios ?? [];
62
+ const md = [];
63
+ md.push("# ComfyUI LLM Arena", "");
64
+ md.push(
65
+ `Models driving a real ComfyUI (${base.gpu}) through [comfyui-mcp](https://github.com/artokun/comfyui-mcp)'s ` +
66
+ `compact tool mode — 6 router tools instead of ~200 schemas, so every model class can play. ` +
67
+ `Each model gets the identical task set; results are verified against the ComfyUI server, not the model's claims. ` +
68
+ `Top-cluster models are best-of-N (range shown).`,
69
+ "",
70
+ );
71
+ const header = ["Model", "Tier", ...scen.map((s) => s.id), "Score", "Nudges", "Rounds", "Time"];
72
+ md.push(`| ${header.join(" | ")} |`, `|${header.map(() => "---").join("|")}|`);
73
+ for (const m of base.leaderboard) {
74
+ const cells = m.results.map((r) => icon[r.score]);
75
+ const totals = m.runs?.totals;
76
+ const score =
77
+ totals && totals.length > 1
78
+ ? `**${m.total}/${m.max}** (best of ${totals.length}: ${Math.min(...totals)}–${Math.max(...totals)})`
79
+ : `**${m.total}/${m.max}**`;
80
+ md.push(
81
+ `| \`${m.model}\` | ${m.tier ?? "local"} | ${cells.join(" | ")} | ${score} | ${nudgesOf(m)} | ${roundsOf(m)} | ${secondsOf(m)}s |`,
82
+ );
83
+ }
84
+ md.push("", `Scenarios: ${scen.map((s) => `**${s.id}** (${s.title.toLowerCase()})`).join(" · ")}`, "");
85
+ md.push(`✅ completed & server-verified · 🟡 right tool family, incomplete outcome · ❌ failed`, "");
86
+ md.push("Reproduce: `npm run arena` — bring your own models via `ARENA_MODELS=...` (see docs/arena)");
87
+ writeFileSync(join(baseDir, "arena-report.md"), `${md.join("\n")}\n`);
88
+ console.log("report regenerated");
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ // Render the LLM Arena leaderboard as share/docs-ready SVGs (light + dark).
3
+ //
4
+ // node scripts/arena-graphic.mjs [path/to/arena-results.json]
5
+ //
6
+ // Emits arena-leaderboard-light.svg and arena-leaderboard-dark.svg next to the
7
+ // results file. Palette validated with the dataviz six-checks (CVD ΔE ≥ 41,
8
+ // dark-surface contrast ≥ 3:1); tier identity is never color-alone — every row
9
+ // names its tier in ink.
10
+ import { readFileSync, writeFileSync } from "node:fs";
11
+ import { dirname, join } from "node:path";
12
+
13
+ const resultsPath = process.argv[2] ?? join(process.cwd(), "arena-results", "arena-results.json");
14
+ const data = JSON.parse(readFileSync(resultsPath, "utf8"));
15
+ const rows = data.leaderboard ?? [];
16
+ const maxScore = rows[0]?.max ?? 20;
17
+
18
+ const MODES = {
19
+ light: {
20
+ surface: "#fcfcfb",
21
+ inkPrimary: "#0b0b0b",
22
+ inkSecondary: "#52514e",
23
+ inkMuted: "#898781",
24
+ grid: "#e1e0d9",
25
+ baseline: "#c3c2b7",
26
+ track: "#f0efec",
27
+ tier: { SoTA: "#2a78d6", "B-tier": "#1baf7a", local: "#eda100" },
28
+ },
29
+ dark: {
30
+ surface: "#1a1a19",
31
+ inkPrimary: "#ffffff",
32
+ inkSecondary: "#c3c2b7",
33
+ inkMuted: "#898781",
34
+ grid: "#2c2c2a",
35
+ baseline: "#383835",
36
+ track: "#232322",
37
+ tier: { SoTA: "#3987e5", "B-tier": "#199e70", local: "#c98500" },
38
+ },
39
+ };
40
+
41
+ const FONT = `system-ui, -apple-system, 'Segoe UI', sans-serif`;
42
+ const W = 860;
43
+ const PAD = 28;
44
+ const HEADER_H = 92;
45
+ const ROW_H = 34;
46
+ const BAR_H = 14;
47
+ const LABEL_W = 250; // model name + tier text
48
+ const VALUE_W = 90; // right column: score (+ range)
49
+ const FOOTER_H = 64;
50
+ const plotW = W - PAD * 2 - LABEL_W - VALUE_W;
51
+
52
+ const esc = (s) => String(s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
53
+
54
+ function render(mode) {
55
+ const c = MODES[mode];
56
+ const H = HEADER_H + rows.length * ROW_H + FOOTER_H;
57
+ const plotX = PAD + LABEL_W;
58
+ const parts = [];
59
+ parts.push(
60
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}" font-family="${FONT}">`,
61
+ `<rect width="${W}" height="${H}" rx="12" fill="${c.surface}"/>`,
62
+ `<text x="${PAD}" y="${PAD + 10}" font-size="19" font-weight="700" fill="${c.inkPrimary}">ComfyUI LLM Arena</text>`,
63
+ `<text x="${PAD}" y="${PAD + 32}" font-size="12.5" fill="${c.inkSecondary}">${rows.length} models · ${data.scenarios?.length ?? 10} real ComfyUI tasks over MCP · every score verified against the server, not the model's claims</text>`,
64
+ );
65
+ // legend (tier chips + names)
66
+ let lx = PAD;
67
+ for (const [tier, color] of Object.entries(c.tier)) {
68
+ parts.push(
69
+ `<rect x="${lx}" y="${PAD + 44}" width="10" height="10" rx="2" fill="${color}"/>`,
70
+ `<text x="${lx + 15}" y="${PAD + 53}" font-size="11.5" fill="${c.inkSecondary}">${tier}</text>`,
71
+ );
72
+ lx += 15 + tier.length * 6.6 + 22;
73
+ }
74
+ // gridlines + scale ticks
75
+ for (const tick of [0, 5, 10, 15, 20]) {
76
+ const x = plotX + (tick / maxScore) * plotW;
77
+ parts.push(
78
+ `<line x1="${x}" y1="${HEADER_H - 6}" x2="${x}" y2="${HEADER_H + rows.length * ROW_H}" stroke="${tick === 0 ? c.baseline : c.grid}" stroke-width="1"/>`,
79
+ `<text x="${x}" y="${HEADER_H + rows.length * ROW_H + 16}" font-size="10.5" fill="${c.inkMuted}" text-anchor="middle" font-variant-numeric="tabular-nums">${tick}</text>`,
80
+ );
81
+ }
82
+ // rows
83
+ rows.forEach((m, i) => {
84
+ const y = HEADER_H + i * ROW_H;
85
+ const cy = y + ROW_H / 2;
86
+ const color = c.tier[m.tier] ?? c.inkMuted;
87
+ const w = Math.max(2, (m.total / m.max) * plotW);
88
+ const runs = m.runs?.totals;
89
+ const range = runs && runs.length > 1 ? `${Math.min(...runs)}–${Math.max(...runs)}` : null;
90
+ const name = m.model.length > 34 ? `${m.model.slice(0, 33)}…` : m.model;
91
+ parts.push(
92
+ `<text x="${PAD}" y="${cy - 1}" font-size="12.5" font-weight="600" fill="${c.inkPrimary}">${esc(name)}</text>`,
93
+ `<text x="${PAD}" y="${cy + 12}" font-size="10" fill="${c.inkSecondary}">${esc(m.tier ?? "local")}</text>`,
94
+ // track + bar: thin mark, 4px rounded DATA end only (square baseline end)
95
+ `<rect x="${plotX}" y="${cy - BAR_H / 2}" width="${plotW}" height="${BAR_H}" fill="${c.track}"/>`,
96
+ `<path d="M ${plotX} ${cy - BAR_H / 2} H ${plotX + w - 4} a 4 4 0 0 1 4 4 v ${BAR_H - 8} a 4 4 0 0 1 -4 4 H ${plotX} Z" fill="${color}"/>`,
97
+ `<text x="${plotX + plotW + 12}" y="${cy + 4}" font-size="13" font-weight="700" fill="${c.inkPrimary}" font-variant-numeric="tabular-nums">${m.total}/${m.max}</text>`,
98
+ );
99
+ if (range) {
100
+ parts.push(
101
+ `<text x="${plotX + plotW + 12}" y="${cy + 16}" font-size="9.5" fill="${c.inkMuted}" font-variant-numeric="tabular-nums">best of ${runs.length} (${range})</text>`,
102
+ );
103
+ }
104
+ });
105
+ const fy = HEADER_H + rows.length * ROW_H + 38;
106
+ parts.push(
107
+ `<text x="${PAD}" y="${fy}" font-size="10.5" fill="${c.inkMuted}">${esc(data.gpu ?? "")} · temperature 0 · scenarios: ${esc((data.scenarios ?? []).map((s) => s.id).join(" · "))}</text>`,
108
+ `<text x="${PAD}" y="${fy + 15}" font-size="10.5" fill="${c.inkMuted}">Reproduce with your own models: npm run arena — github.com/artokun/comfyui-mcp</text>`,
109
+ `</svg>`,
110
+ );
111
+ return parts.join("\n");
112
+ }
113
+
114
+ const outDir = dirname(resultsPath);
115
+ for (const mode of ["light", "dark"]) {
116
+ const file = join(outDir, `arena-leaderboard-${mode}.svg`);
117
+ writeFileSync(file, render(mode));
118
+ console.log(`wrote ${file}`);
119
+ }