Skip to content

Commit ae261c6

Browse files
Hermes Botclaude
andcommitted
feat(mcp): restore full Hermes MCP roster (codebase-memory, comfyui, n8n, orchestration)
The V1->V2 migration silently dropped Hermes' gateway MCP set from V1's 8 servers to 3 (memory-vault, qdrant-rag, searxng). This restores the four whose backing service exists in V2, as kind=mcp plugins ported from V1's registry-custom.yaml (the per-server source of truth): - codebase-memory: code knowledge graph over /c/dev (read-only), longLived + disableNetwork, named cache volume. Index-per-session (in-memory graph). - comfyui: ComfyUI media tools. Plugin id `comfyui-mcp`, but mcp.server_id pins the gateway registry key to `comfyui` to preserve Hermes' `comfyui__*` tool namespace (the comfyui SERVICE plugin already owns the bare id). - n8n: full czlonkowski catalog + n8n_* instance verbs. Banner/telemetry suppression (LOG_LEVEL=error, N8N_DIAGNOSTICS_ENABLED=false, DISABLE_TELEMETRY =true) keeps the stdio JSON-RPC clean -> full 42 tools, not docs-only 23. Image digest-pinned. N8N_API_KEY declared as a plugin secret. - orchestration: stable verbs delegating to the dashboard /api/orchestration control plane (verified live in V2). Render/compose changes: - render._render_mcp: optional mcp.server_id decouples the gateway registry key (Hermes tool-namespace prefix) from the plugin id, with collision detection. - compose._mcp_gateway: add MCP_GATEWAY_DOCKER_BIND_ALLOWED_PATHS=${CODE_ROOT} (codebase-memory's read-only /c/dev bind is rejected without it) and the COMFY_MCP_DEFAULT_MODEL default. The secrets the spawned servers need (OPS_CONTROLLER_TOKEN, DASHBOARD_AUTH_TOKEN, N8N_API_KEY) deliberately arrive via the secrets.env env_file, NOT the environment block -- a ${VAR:-} there interpolates from .env/host (empty) and would SHADOW the env_file value. V2 build contexts (v2/docker/{codebase-memory,comfyui,orchestration}-mcp) follow the qdrant-rag-mcp convention: a README pointing at the operator's authoritative V1 source context (not duplicated, to avoid drift). Images built as ordo-v2/*. Deferred (backing not in this stack): blog-mcp (separate min-max blog stack), playwright (generic browser tool, RCE-equivalent, no stack-service backing; operator's browser-validation uses a dedicated image). Tests: +12 (compose gateway env, server_id decoupling + collision, per-server wiring, n8n digest+banner, codebase-memory volumes/longLived, secrets.env.example N8N_API_KEY, servers.txt/registry-custom.yaml assertions). Parity matrix updated 3->7 MCP. 221 passed / 6 skipped, ruff clean. Co-Authored-By: Claude Opus 4.8 <[email protected]>
1 parent 8317917 commit ae261c6

12 files changed

Lines changed: 412 additions & 7 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# codebase-memory-mcp (Code knowledge-graph MCP server)
2+
3+
V2's Codebase-Memory MCP image, referenced by the `codebase-memory` plugin as
4+
`ordo-v2/codebase-memory-mcp:latest`. V1 builds it locally
5+
(`ordo-ai-stack-codebase-memory-mcp:latest`) from `C:\dev\ordo-ai-stack\codebase-memory-mcp` — a
6+
self-contained Dockerfile that downloads + sha256-verifies the pinned upstream
7+
`DeusData/codebase-memory-mcp` portable (statically-linked) release binary and bundles the offline
8+
`nomic-embed-code` embeddings, so it runs 100% offline (`disableNetwork: true` in the gateway
9+
catalog). There is no public registry to digest-pin against, so it's a **project buildable image**
10+
(pinned by build context: the Dockerfile's `CBM_VERSION` + `CBM_SHA256` args); `ordo preflight`
11+
reports a missing one as "build first".
12+
13+
## Build
14+
Build from the operator's authoritative source context (kept as the single source of truth — not
15+
duplicated here to avoid drift), tagging the V2 image:
16+
```
17+
docker build -t ordo-v2/codebase-memory-mcp:latest C:/dev/ordo-ai-stack/codebase-memory-mcp
18+
```
19+
20+
This image is gateway-spawned (stdio) and kept warm (`longLived: true`) so its in-memory graph
21+
survives across calls within a session. It appears in the rendered `mcp-registry.yaml`, not as a
22+
long-lived compose service. A fresh spawn starts with an EMPTY graph — call `index_repository`
23+
once per session (against `/c/dev/<repo>`) before structural queries; the index also persists in
24+
the `codebase-memory-cache` named volume.

v2/docker/comfyui-mcp/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# comfyui-mcp (ComfyUI MCP server)
2+
3+
V2's ComfyUI MCP image, referenced by the `comfyui` plugin as `ordo-v2/comfyui-mcp:latest`.
4+
V1 builds it locally (`ordo-ai-stack-comfyui-mcp:latest`) from `C:\dev\ordo-ai-stack\comfyui-mcp`
5+
— the upstream `joenorton/comfyui-mcp-server` (pinned to commit `e0101b2312f3`) plus the stack's
6+
overrides (stdio-clean `print()` redirect, flat `run_workflow` args + default workflow, custom-node
7+
pip + comfyui-restart tools via ops-controller, and system-state tools: GPU / queue / models /
8+
nodes / extensions). It talks to `http://comfyui:8188` and `http://ops-controller:9000`. There is
9+
no public registry to digest-pin against, so it's a **project buildable image** (pinned by its
10+
build context); `ordo preflight` reports a missing one as "build first".
11+
12+
## Build
13+
Build from the operator's authoritative source context (kept as the single source of truth — not
14+
duplicated here to avoid drift), tagging the V2 image:
15+
```
16+
docker build -t ordo-v2/comfyui-mcp:latest C:/dev/ordo-ai-stack/comfyui-mcp
17+
```
18+
19+
This image is gateway-spawned (stdio), so it appears in the rendered `mcp-registry.yaml`, not as a
20+
long-lived compose service. It needs network access to reach `comfyui:8188` (`disableNetwork`
21+
unset). `COMFY_MCP_DEFAULT_MODEL` + `OPS_CONTROLLER_TOKEN` are substituted from the gateway env
22+
into its catalog entry at gateway startup.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# orchestration-mcp (Stable orchestration adapter)
2+
3+
V2's Orchestration MCP image, referenced by the `orchestration` plugin as
4+
`ordo-v2/orchestration-mcp:latest`. V1 builds it locally
5+
(`ordo-ai-stack-orchestration-mcp:latest`) from `C:\dev\ordo-ai-stack\orchestration-mcp` — a thin
6+
adapter exposing STABLE tool names (list_templates / create_from_template / run_workflow /
7+
await_run / list_jobs / publish_enqueue / schedules / registry parity verbs / comfyui ops …) that
8+
delegate over HTTP to the dashboard control plane at `http://dashboard:8080/api/orchestration/*`
9+
(Bearer `DASHBOARD_AUTH_TOKEN`). It insulates the agent from shifting raw gateway tool names.
10+
There is no public registry to digest-pin against, so it's a **project buildable image** (pinned by
11+
its build context); `ordo preflight` reports a missing one as "build first".
12+
13+
Backing verified in V2: the `ordo-v2/dashboard-v1` image serves `/api/orchestration/*`
14+
(readiness probe returns `ok`), so this adapter's target exists in the V2 stack.
15+
16+
## Build
17+
Build from the operator's authoritative source context (kept as the single source of truth — not
18+
duplicated here to avoid drift), tagging the V2 image:
19+
```
20+
docker build -t ordo-v2/orchestration-mcp:latest C:/dev/ordo-ai-stack/orchestration-mcp
21+
```
22+
23+
This image is gateway-spawned (stdio), so it appears in the rendered `mcp-registry.yaml`, not as a
24+
long-lived compose service. It needs network access to reach `dashboard:8080` (`disableNetwork`
25+
unset). `DASHBOARD_AUTH_TOKEN` is substituted from the gateway env into its catalog entry at
26+
gateway startup.

v2/ordo/compose.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,20 @@ def _mcp_gateway(project: str, net: str, env_file: str) -> dict[str, Any]:
235235
"COMFYUI_URL": "http://comfyui:8188",
236236
"N8N_API_URL": "http://n8n:5678",
237237
"CODE_ROOT": "${CODE_ROOT:-/c/dev}",
238+
# Bind-mount allowlist for the SPAWNED sibling MCP servers. The gateway's hardened bind logic
239+
# only accepts host binds whose source is on this list (and read-only). codebase-memory mounts
240+
# $CODE_ROOT read-only at /c/dev, so the allowlist must contain CODE_ROOT — else the gateway
241+
# rejects the mount and the codebase-memory server fails to spawn. Mirrors V1's gateway env.
242+
"MCP_GATEWAY_DOCKER_BIND_ALLOWED_PATHS": "${CODE_ROOT:-/c/dev}",
243+
# ComfyUI MCP's default checkpoint (a non-secret default, safe to interpolate from .env-space).
244+
# The other secrets the spawned MCP servers need — OPS_CONTROLLER_TOKEN (comfyui),
245+
# DASHBOARD_AUTH_TOKEN (orchestration), N8N_API_KEY (n8n) — are NOT declared here on purpose:
246+
# they arrive via the `secrets.env` env_file (already layered on this service). Re-declaring
247+
# them in `environment:` with `${VAR:-}` would interpolate from .env/host (where they're
248+
# absent → empty) and SHADOW the env_file value to empty. gateway-wrapper.sh reads them from
249+
# the process env (env_file) to substitute the PLACEHOLDER_* tokens + build the --secrets
250+
# dotenv, so env_file delivery is sufficient and correct.
251+
"COMFY_MCP_DEFAULT_MODEL": "${COMFY_MCP_DEFAULT_MODEL:-flux1-schnell-fp8.safetensors}",
238252
# HOST path of the shared markdown memory vault. The wrapper substitutes it into the
239253
# memory-vault MCP's catalog volume (PLACEHOLDER_MEMORY_VAULT_PATH) so the SPAWNED sibling
240254
# container binds the same host dir native Obsidian (opened at this path) + host seeding

v2/ordo/render.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ def _render_mcp(mcps: list, project: str = "ordo-v2") -> tuple[list[dict[str, An
393393
project images (ordo-v2/*) are exempt: they're pinned by build context, not registry digest."""
394394
servers: list[dict[str, Any]] = []
395395
notes: list[str] = []
396+
seen_ids: dict[str, str] = {}
396397
for p in mcps:
397398
image = str(p.mcp.get("image", ""))
398399
digest = image.split("@sha256:")[-1] if "@sha256:" in image else ""
@@ -402,8 +403,17 @@ def _render_mcp(mcps: list, project: str = "ordo-v2") -> tuple[list[dict[str, An
402403
notes.append(f"mcp '{p.id}': image is not digest-pinned — refuse in production")
403404
elif len(set(digest)) <= 1: # placeholder like 000.../111...
404405
notes.append(f"mcp '{p.id}': image digest is a placeholder — set the real sha256")
406+
# The gateway registry key (servers.txt id + tool-namespace prefix Hermes sees, e.g.
407+
# `comfyui__system_stats`) defaults to the plugin id. A plugin may set mcp.server_id to
408+
# DECOUPLE that key from its plugin id — needed when a kind=service plugin already owns the
409+
# bare name (the comfyui SERVICE plugin owns `comfyui`, so its MCP plugin is id `comfyui-mcp`
410+
# but keeps server_id `comfyui` to preserve V1's `comfyui__*` tool namespace).
411+
server_id = str(p.mcp.get("server_id") or p.id)
412+
if server_id in seen_ids:
413+
notes.append(f"mcp '{p.id}': server_id '{server_id}' collides with plugin '{seen_ids[server_id]}'")
414+
seen_ids[server_id] = p.id
405415
servers.append({
406-
"id": p.id, "name": p.name, "image": image,
416+
"id": server_id, "name": p.name, "image": image,
407417
"env": dict(p.mcp.get("env", {}) or {}),
408418
"tools": list(p.mcp.get("tools", []) or []),
409419
# Optional gateway-catalog passthrough (file-based MCP servers): a host bind for the data
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Plugin manifest — data-only. Registers the codebase-memory MCP server (agent tool), not a compose
2+
# service. Gives Hermes a code KNOWLEDGE GRAPH over the repos under the code root (mounted read-only
3+
# at /c/dev): structural queries grep can't do cheaply — call graphs, trace paths between symbols,
4+
# architecture overviews, symbol/snippet lookup. Ports V1's registry-custom.yaml `codebase-memory`
5+
# entry (the source of truth for its wiring). Companion to the codebase-memory-UI (3D graph) service,
6+
# but a SEPARATE process: this gateway-spawned MCP builds its own IN-MEMORY graph per spawn, so a
7+
# fresh session starts empty until index_repository is called (see the codebase-memory Hermes skill).
8+
id: codebase-memory
9+
name: Codebase Memory (MCP tools)
10+
description: Code knowledge-graph navigation (call graphs, trace paths, architecture, snippets) over the repos under the code root, via MCP.
11+
kind: mcp # registers an MCP server (agent tool), not a compose service
12+
requires:
13+
nvidia: false # bundled offline embeddings run on CPU — no GPU
14+
ram_gb: 2
15+
provides: [tools]
16+
mcp:
17+
# V1 builds this locally (ordo-ai-stack-codebase-memory-mcp:latest) from a self-contained Dockerfile
18+
# that downloads + sha256-verifies the pinned DeusData/codebase-memory-mcp portable binary and bundles
19+
# the offline nomic-embed-code embeddings. V2 mirrors it as a project buildable image (build context
20+
# doc under v2/docker/codebase-memory-mcp): pinned by its build context (the Dockerfile's CBM_VERSION
21+
# + CBM_SHA256), so preflight reports 'build first', not a placeholder-digest warning.
22+
image: ordo-v2/codebase-memory-mcp:latest
23+
# Keep the indexer container WARM across calls within a session — the graph is in-memory per spawn,
24+
# so this preserves an index built via index_repository until the session ends (avoids re-index).
25+
longLived: true
26+
# The indexer is 100% local (bundled embeddings) — no egress needed. Blocks exfiltration of indexed
27+
# code from the spawned container.
28+
disableNetwork: true
29+
volumes:
30+
# Code root (HOST path from $CODE_ROOT) mounted READ-ONLY. Under the gateway's bind-mount hardening
31+
# host binds must be read-only AND allow-listed via MCP_GATEWAY_DOCKER_BIND_ALLOWED_PATHS (the
32+
# gateway sets it to $CODE_ROOT). PLACEHOLDER_CODE_ROOT is substituted from the gateway's CODE_ROOT
33+
# env by gateway-wrapper.sh (the gateway spawns this as a sibling via docker.sock, so the source
34+
# must be a HOST path, not a gateway-container path).
35+
- "PLACEHOLDER_CODE_ROOT:/c/dev:ro"
36+
# Persistent SQLite index — a NAMED volume (exempt from the host-path read-only restriction, so it
37+
# can be read-write). Survives container respawns.
38+
- "codebase-memory-cache:/cache"
39+
env:
40+
CBM_CACHE_DIR: /cache
41+
# Keep logs off stdout so they can't corrupt the stdio JSON-RPC channel.
42+
CBM_LOG_LEVEL: error
43+
tools:
44+
- index_repository
45+
- list_projects
46+
- index_status
47+
- search_graph
48+
- trace_path
49+
- query_graph
50+
- get_graph_schema
51+
- get_code_snippet
52+
- get_architecture
53+
- search_code
54+
- detect_changes
55+
- manage_adr
56+
- ingest_traces
57+
- delete_project

v2/plugins/comfyui-mcp/plugin.yaml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Plugin manifest — data-only. Registers the ComfyUI MCP server (agent tool), not a compose service.
2+
# The comfyui compose SERVICE is provided by the separate `comfyui` (kind=service) plugin; THIS plugin
3+
# only exposes ComfyUI's media tools (workflows, images, video, model pull, system stats, queue,
4+
# history, installed models/nodes/extensions) to Hermes via the gateway. Ports V1's registry-custom.yaml
5+
# `comfyui` entry (the source of truth for its wiring).
6+
#
7+
# Plugin id is `comfyui-mcp` (the service plugin already owns `comfyui`), but mcp.server_id pins the
8+
# GATEWAY registry key back to `comfyui` so Hermes keeps the V1 `comfyui__*` tool namespace.
9+
id: comfyui-mcp
10+
name: ComfyUI (MCP tools)
11+
description: ComfyUI media tools (workflows, images, video, model pull, system stats, queue, history, installed models/nodes/extensions) exposed to the agent via MCP.
12+
kind: mcp # registers an MCP server (agent tool), not a compose service
13+
requires:
14+
nvidia: false # the MCP is a thin HTTP client of comfyui:8188; the GPU work is comfyui's
15+
ram_gb: 1
16+
provides: [tools]
17+
depends_on: [comfyui] # queries the comfyui service (kind=service plugin) + ops-controller
18+
mcp:
19+
# Gateway registry key + Hermes tool-namespace prefix (comfyui__*). Decoupled from the plugin id so
20+
# it stays `comfyui` even though the plugin is `comfyui-mcp` (the comfyui SERVICE plugin owns the id).
21+
server_id: comfyui
22+
# V1 builds this locally (ordo-ai-stack-comfyui-mcp:latest). V2 mirrors it as a project buildable
23+
# image (build context doc under v2/docker/comfyui-mcp): pinned by its build context (upstream commit
24+
# e0101b2312f3 + stack overrides), so preflight reports 'build first' rather than a digest warning.
25+
image: ordo-v2/comfyui-mcp:latest
26+
# Needs network access to reach comfyui:8188 + ops-controller:9000 on ordo-v2-net — NOT offline.
27+
disableNetwork: false
28+
env:
29+
COMFYUI_URL: http://comfyui:8188
30+
OPS_CONTROLLER_URL: http://ops-controller:9000
31+
# Substituted from the gateway env by gateway-wrapper.sh at startup (secrets stay out of the
32+
# committed catalog; the gateway holds the real value from secrets.env).
33+
OPS_CONTROLLER_TOKEN: PLACEHOLDER_OPS_CONTROLLER_TOKEN
34+
COMFY_MCP_DEFAULT_MODEL: PLACEHOLDER_COMFY_MCP_DEFAULT_MODEL
35+
# Representative read-only tools (the image registers the full set via register_system_tools /
36+
# register_management_tools / register_workflow_tools); the gateway advertises everything at runtime.
37+
tools:
38+
- get_system_stats
39+
- get_queue
40+
- get_installed_models
41+
- list_workflows
42+
- run_workflow

v2/plugins/n8n/plugin.yaml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Plugin manifest — data-only. Registers the n8n MCP server (agent tool), not a compose service.
2+
# The n8n compose SERVICE is provided by the separate `automation` (kind=service) plugin; THIS plugin
3+
# only bridges the local n8n instance + the czlonkowski/n8n-mcp node & template catalog to Hermes via
4+
# the gateway. Ports V1's registry-custom.yaml `n8n` entry (the source of truth for its wiring).
5+
id: n8n
6+
name: n8n workflow automation (MCP tools)
7+
description: n8n workflow automation exposed to the agent via MCP — bridges the local n8n instance plus the full czlonkowski/n8n-mcp node and template catalog.
8+
kind: mcp # registers an MCP server (agent tool), not a compose service
9+
requires:
10+
nvidia: false
11+
ram_gb: 1
12+
provides: [tools]
13+
depends_on: [automation] # queries the n8n service (automation kind=service plugin)
14+
# N8N_API_KEY is an operator secret (n8n personal API token). Declaring it here emits the key into
15+
# secrets.env.example; the rendered compose reads secrets.env as a second env_file, so the gateway
16+
# has $N8N_API_KEY in its env and gateway-wrapper.sh (1) substitutes PLACEHOLDER_N8N_API_KEY into this
17+
# catalog entry AND (2) writes n8n.api_key into the gateway's --secrets dotenv so the n8n_* instance
18+
# tools register (not just the docs-only subset).
19+
secrets:
20+
- N8N_API_KEY
21+
mcp:
22+
# Upstream czlonkowski/n8n-mcp image (mcp/n8n). Digest-pinned so the gateway resolves it from THIS
23+
# catalog, never Docker's unpinned online catalog (the orphan-container/drift source V1 suffered).
24+
image: mcp/n8n@sha256:061cdb8fbaa78f5a09787338715b180a0759057759f402c473b5f6ee13a8709e
25+
# Needs network access to reach n8n:5678 — NOT offline.
26+
disableNetwork: false
27+
env:
28+
N8N_API_URL: http://n8n:5678
29+
# Substituted from the gateway's $N8N_API_KEY (sourced from secrets.env) by gateway-wrapper.sh.
30+
N8N_API_KEY: PLACEHOLDER_N8N_API_KEY
31+
# CRITICAL: silence the image's box-drawing startup banner + INFO logs. With stdio transport ANY
32+
# non-JSON-RPC byte before the response makes the gateway crash ('invalid character') OR collapses
33+
# the tool set to the docs-only ~23 instead of the full ~42. See project memory
34+
# [project_ordo_n8n_mcp_image_docs_only].
35+
LOG_LEVEL: error
36+
N8N_DIAGNOSTICS_ENABLED: "false"
37+
DISABLE_TELEMETRY: "true"
38+
# Representative tools (the image registers the full czlonkowski catalog + n8n_* instance verbs when
39+
# the API key is present); the gateway advertises the full set at runtime.
40+
tools:
41+
- list_nodes
42+
- get_node_info
43+
- search_templates
44+
- n8n_list_workflows
45+
- n8n_create_workflow
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Plugin manifest — data-only. Registers the orchestration MCP server (agent tool), not a compose
2+
# service. A STABLE adapter: exposes fixed verb names (list_templates / create_from_template /
3+
# run_workflow / await_run / list_jobs / publish_enqueue / schedules / registry parity verbs /
4+
# comfyui ops …) that delegate over HTTP to the dashboard control plane, insulating Hermes from
5+
# shifting raw gateway tool names. Ports V1's registry-custom.yaml `orchestration` entry (the source
6+
# of truth for its wiring). Backing verified in V2: ordo-v2/dashboard-v1 serves /api/orchestration/*.
7+
id: orchestration
8+
name: Orchestration (MCP tools)
9+
description: Stable orchestration adapter (fixed verbs; delegates to the dashboard /api/orchestration control plane, not shifting gateway tool names).
10+
kind: mcp # registers an MCP server (agent tool), not a compose service
11+
requires:
12+
nvidia: false
13+
ram_gb: 1
14+
provides: [tools]
15+
# No plugin-level depends_on: the target is the CORE `dashboard` service (always present, not a
16+
# plugin), so there's no plugin dependency to gate on. (A plugin `depends_on` must name an enabled
17+
# PLUGIN or the plugin is dropped; `dashboard` is core, so listing it would wrongly drop this MCP.)
18+
mcp:
19+
# V1 builds this locally (ordo-ai-stack-orchestration-mcp:latest). V2 mirrors it as a project
20+
# buildable image (build context doc under v2/docker/orchestration-mcp): pinned by its build context,
21+
# so preflight reports 'build first' rather than a digest warning.
22+
image: ordo-v2/orchestration-mcp:latest
23+
# Needs network access to reach dashboard:8080 — NOT offline.
24+
disableNetwork: false
25+
env:
26+
ORCHESTRATION_DASHBOARD_URL: http://dashboard:8080
27+
# Bearer for the dashboard control plane. Substituted from the gateway's $DASHBOARD_AUTH_TOKEN
28+
# (sourced from secrets.env) by gateway-wrapper.sh at startup.
29+
DASHBOARD_AUTH_TOKEN: PLACEHOLDER_DASHBOARD_AUTH_TOKEN
30+
tools:
31+
- orchestration_readiness
32+
- list_templates
33+
- run_workflow
34+
- await_run
35+
- list_jobs
36+
- comfyui_status
37+
- list_models
38+
- gpu_status

0 commit comments

Comments
 (0)