comfyui-mcp 0.52.17 → 0.52.18

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.
@@ -760,6 +760,8 @@ const MUTATING_GRAPH_EDIT_CMDS = new Set([
760
760
  "graph_subgraph_group",
761
761
  "graph_expose_subgraph_input",
762
762
  "graph_expose_subgraph_output",
763
+ "graph_unexpose_subgraph_input",
764
+ "graph_unexpose_subgraph_output",
763
765
  "graph_promote_widget",
764
766
  "graph_move_rail",
765
767
  "graph_paste_nodes",
@@ -8924,6 +8926,8 @@ export const RETRY_TOKEN_CMD_BY_TOOL = {
8924
8926
  panel_promote_widget: "graph_promote_widget",
8925
8927
  panel_expose_subgraph_output: "graph_expose_subgraph_output",
8926
8928
  panel_expose_subgraph_input: "graph_expose_subgraph_input",
8929
+ panel_unexpose_subgraph_output: "graph_unexpose_subgraph_output",
8930
+ panel_unexpose_subgraph_input: "graph_unexpose_subgraph_input",
8927
8931
  panel_unpack_subgraph: "graph_unpack_subgraph",
8928
8932
  panel_update_node: "graph_update_node",
8929
8933
  };
@@ -12096,6 +12100,12 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
12096
12100
  to_input: args.to_input,
12097
12101
  name: args.name,
12098
12102
  }, 15000)),
12103
+ def("panel_unexpose_subgraph_output", "REMOVE a subgraph's OUTPUT boundary slot — UN-expose it (the inverse of panel_expose_subgraph_output), so the PARENT graph's subgraph node loses that output slot. You MUST be INSIDE the subgraph first (panel_enter_subgraph). Identify the slot by the string `name` only — the boundary slot name exactly as panel_query_graph lists it under `rails.output.accepts_inputs`. A rail_node_id string such as \"-20\" is forwarded to the panel, which REFUSES it: that is the synthetic id of the whole rail, not of a slot on it. DESTRUCTIVE: the interior wire feeding the slot and any parent-graph wires on host subgraph nodes' matching slot are dropped with it — the reply's `removed.interior_links_dropped` / `removed.host_links_dropped` say how many went. An unknown name refuses and lists the slots that DO exist; nothing is removed on a refusal. Undoable with Ctrl+Z.", {
12104
+ name: z.string().describe("Boundary output slot name (e.g. 'IMAGE') exactly as panel_query_graph lists it under rails.output.accepts_inputs — NOT a rail_node_id."),
12105
+ }, async (args, ctx) => ctx.call({ cmd: "graph_unexpose_subgraph_output", name: args.name }, 15000)),
12106
+ def("panel_unexpose_subgraph_input", "REMOVE a subgraph's INPUT boundary slot — UN-expose it (the inverse of panel_expose_subgraph_input), so the PARENT graph's subgraph node loses that input slot. You MUST be INSIDE the subgraph first (panel_enter_subgraph). Identify the slot by the string `name` only — the boundary slot name exactly as panel_query_graph lists it under `rails.input.provides_outputs`. A rail_node_id string such as \"-10\" is forwarded to the panel, which REFUSES it: that is the synthetic id of the whole rail, not of a slot on it. DESTRUCTIVE: the interior wire the slot fed and any parent-graph wires on host subgraph nodes' matching slot are dropped with it — the reply's `removed.interior_links_dropped` / `removed.host_links_dropped` say how many went. An unknown name refuses and lists the slots that DO exist; nothing is removed on a refusal. Undoable with Ctrl+Z.", {
12107
+ name: z.string().describe("Boundary input slot name (e.g. 'model') exactly as panel_query_graph lists it under rails.input.provides_outputs — NOT a rail_node_id."),
12108
+ }, async (args, ctx) => ctx.call({ cmd: "graph_unexpose_subgraph_input", name: args.name }, 15000)),
12099
12109
  def("panel_unpack_subgraph", "EXPAND / DISSOLVE a subgraph node on the user's open graph — inline its interior nodes back into the PARENT graph, rewire all external links to those now-inlined nodes, and remove the subgraph wrapper. This is the frontend's \"Unpack Subgraph\" (litegraph LGraph.unpackSubgraph) and the exact INVERSE of panel_create_subgraph. Use it to flatten a stage that was over-nested, or to edit interior nodes directly at the parent level. The interior nodes reappear on the parent canvas with their connections preserved. Undoable with Ctrl+Z.", { node_id: nodeId().describe("Subgraph node id to unpack/dissolve (is_subgraph=true, from panel_graph_outline / panel_query_graph).") }, async (args, ctx) => ctx.call({ cmd: "graph_unpack_subgraph", node_id: args.node_id }, 15000)),
12100
12110
  def("panel_search_nodes", "Search installable custom-node packs via the user's BUILT-IN ComfyUI Manager (the same source the Manager UI uses). Returns matching packs {id, title, description}. Use the `id` with panel_install_node. Prefer this over the headless search_custom_nodes tool — it works against the user's actual (Desktop) Manager. If Manager's cache mappings endpoint returns HTTP 5xx, this retries remote/local and still searches; a remaining 5xx is a Manager outage, not proof the pack is missing.", { query: z.string().describe("Search text, e.g. 'kjnodes', 'controlnet', 'ipadapter'."), limit: z.number().int().min(1).max(40).optional().describe("Max results to return, 1-40 (default 15). Requests above 40 are refused; the panel also clamps to 40 and discloses limit_cap.") }, async (args, ctx) => {
12101
12111
  // #1669 — the panel asks getmappings?mode=cache and used to fail the