feat(mcp): restore full Hermes MCP roster (codebase-memory, comfyui, n8n, orchestration)#86
Merged
Merged
Conversation
…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]>
e0ce1f7 to
ae261c6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The V1→V2 migration silently dropped Hermes' gateway MCP set from V1's 8 servers to 3 (memory-vault, qdrant-rag, searxng). Operator intent: "the agent should have full viz on mcp tools." This restores the servers whose backing service exists in V2, ported from V1's
registry-custom.yaml(the per-server source of truth).Per-server evidence (validated LIVE through the gateway)
Gateway log after
docker restartofordo-v2-mcp-gateway-1:Those servers are enabled: codebase-memory, comfyui, memory-vault, n8n, orchestration, qdrant-rag, searxngindex_repository(/c/dev/ordo-ai-stack/v2/ordo)→nodes:251, edges:936;search_graph("render mcp registry")returned real functions_render_mcp(render.py:390-417),_render_registry_custom,_mcp_gateway(compose.py:216-248),renderinitialize+tools/listclean; gateway reachedcomfyui:8188(34 tools enumerated)orchestration_readiness→ok:true, all dashboard control-plane checks pass; reports gatewaytool_count: 133C:\dev\min-max-migration), not in this stackbrowser_run_code_unsafe(RCE-equivalent), no stack-service backing; operator's browser-validation uses a dedicated imagememory-vault (15), qdrant-rag (2), searxng (4+2 resources) — pre-existing, still working (no regression).
CODE_ROOT / gateway env wiring
CODE_ROOTwas already rendered into the gateway env (${CODE_ROOT:-/c/dev}, site.CODE_ROOT=C:/dev).MCP_GATEWAY_DOCKER_BIND_ALLOWED_PATHS=${CODE_ROOT:-/c/dev}— codebase-memory's read-only/c/devbind is REJECTED by the gateway's hardened bind logic without it.COMFY_MCP_DEFAULT_MODELdefault. The three secrets the spawned servers need (OPS_CONTROLLER_TOKEN,DASHBOARD_AUTH_TOKEN,N8N_API_KEY) deliberately arrive via thesecrets.envenv_file, NOT theenvironment:block — a${VAR:-}there interpolates from.env/host (empty) and would SHADOW the env_file value (caught + fixed during live validation).server_id decoupling
render._render_mcpgained an optionalmcp.server_idso the gateway registry key (= Hermes tool-namespace prefix) can differ from the plugin id. Needed because the comfyui SERVICE plugin already ownscomfyui; the MCP plugin iscomfyui-mcpbut renders underserver_id: comfyuito preserve the V1comfyui__*tool namespace. Collision detection included.Build contexts
v2/docker/{codebase-memory,comfyui,orchestration}-mcpfollow the existingqdrant-rag-mcpconvention: a README pointing at the operator's authoritative V1 source context (not duplicated — the V1 tree is CI-tested and duplicating it would create the exact drift the repo's #84 legacy-cleanup recorded). Images built + taggedordo-v2/*.Tests / render discipline
server_iddecoupling + collision, per-server wiring, n8n digest+banner, codebase-memory volumes/longLived,secrets.env.exampleincludesN8N_API_KEY, servers.txt/registry-custom.yaml assertions; parity matrix updated 3→7 MCP.--gpus allcontainer from the liveout/ordo.yaml: compose diff = only the 2 gateway env additions; llamacpp block byte-identical (cksum400317179 773, GPU pinGPU-97fe65eepreserved).docker compose configexit 0.Apply / attestation
ordo-v2-mcp-gateway-1(new env needs a recreate). llamacpp / agent / comfyui / n8n and all other services untouched (verified by uptime). memory-vault / qdrant-rag / searxng still working.🤖 Generated with Claude Code