From 400f11bd35fae0da91c396a1424315da81729982 Mon Sep 17 00:00:00 2001 From: "hermes-seaeye[bot]" <307254004+hermes-seaeye[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2026 22:08:11 +0000 Subject: [PATCH 1/2] fmt(js): `npm run fix` on merge (#119581) Co-authored-by: github-actions[bot] --- apps/desktop/src/app/capabilities/mcp/mcp-status.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/desktop/src/app/capabilities/mcp/mcp-status.ts b/apps/desktop/src/app/capabilities/mcp/mcp-status.ts index 3aa0cca9e0..b85290d9c8 100644 --- a/apps/desktop/src/app/capabilities/mcp/mcp-status.ts +++ b/apps/desktop/src/app/capabilities/mcp/mcp-status.ts @@ -7,7 +7,6 @@ import { NEEDS_AUTH_RE } from '@/lib/mcp-probe-cache' import { type McpServerEntry, serverEnabled } from '@/lib/mcp-servers' import { countEnabledTools } from '@/lib/mcp-tool-filter' - export const MCP_CATALOG_KEY = ['mcp-catalog'] as const export type Probe = McpTestResult | 'probing' From aaf0fd9273d7acde83d53b7ba7a23ea98494bbf7 Mon Sep 17 00:00:00 2001 From: Siddharth Balyan <52913345+alt-glitch@users.noreply.github.com> Date: Wed, 23 Sep 2026 03:54:31 +0530 Subject: [PATCH 2/2] The last four MCP enabled-flag readers use the shared reader (ACP, hermes tools picker, desktop connector card, health sweep) (#119601) * fix(mcp): ACP, `hermes tools` and the desktop connector card use the one enabled reader #119567 left four readers of `mcp_servers..enabled` on their own rules. @webtecnica's #119560 found the ACP one: - `acp_adapter/session.py::_make_agent` used `is not False`, so an ACP session kept a server with `enabled: "false"` or `enabled: 0` in its toolset while the MCP client skipped it. - `hermes tools` MCP picker (`tools_config_mcp._configure_mcp_tools_interactive`) read `enabled: 0` as on and crashed on a non-dict entry. - Desktop connector card (`connectors/data/join.ts`) and the MCP health sweep (`store/mcp-health.ts`) used `enabled !== false`. All four now call `mcp_server_enabled` (Python) or `serverEnabled` (renderer), which share one case table. Co-authored-by: webtecnica * chore: retrigger CI (zero-job dispatch failure, auto-heal) --------- Co-authored-by: webtecnica --- acp_adapter/session.py | 4 +++- apps/desktop/src/app/capabilities/connectors/data/join.ts | 4 ++-- apps/desktop/src/store/mcp-health.ts | 4 ++-- hermes_cli/tools_config_mcp.py | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/acp_adapter/session.py b/acp_adapter/session.py index 0011deda18..9cec87a7ec 100644 --- a/acp_adapter/session.py +++ b/acp_adapter/session.py @@ -475,9 +475,11 @@ class SessionManager: elif isinstance(model_cfg, str): default_model = model_cfg.strip() + from tools.mcp_tool_common import mcp_server_enabled + configured_mcp_servers = [ name for name, cfg in (config.get("mcp_servers") or {}).items() - if not isinstance(cfg, dict) or cfg.get("enabled", True) is not False + if not isinstance(cfg, dict) or mcp_server_enabled(cfg) ] kwargs = { "platform": "acp", "quiet_mode": True, "session_id": session_id, "session_db": self._get_db(), diff --git a/apps/desktop/src/app/capabilities/connectors/data/join.ts b/apps/desktop/src/app/capabilities/connectors/data/join.ts index a775adc28f..b352339dd8 100644 --- a/apps/desktop/src/app/capabilities/connectors/data/join.ts +++ b/apps/desktop/src/app/capabilities/connectors/data/join.ts @@ -11,7 +11,7 @@ import type { import type { McpCatalogEntry } from '@/hermes' import { connectorTitle } from '@/lib/connector-tools' -import type { McpServers } from '@/lib/mcp-servers' +import { type McpServers, serverEnabled } from '@/lib/mcp-servers' import { canAuthenticate } from '../../mcp/mcp-status' import { toolRows } from '../derive-tools' @@ -237,7 +237,7 @@ export function joinLocalServers({ catalog, servers, status, toolCounts, usage } canAuthenticate: canAuthenticate(entry, raw), connectorSlug: text(bundled?.connector_slug), description: text(bundled?.description), - enabled: entry.enabled !== false, + enabled: serverEnabled(entry), inCatalog: bundled !== undefined, name, status: raw, diff --git a/apps/desktop/src/store/mcp-health.ts b/apps/desktop/src/store/mcp-health.ts index c792825f9c..c9f5da147f 100644 --- a/apps/desktop/src/store/mcp-health.ts +++ b/apps/desktop/src/store/mcp-health.ts @@ -17,7 +17,7 @@ import { getHermesConfigRecord, type McpTestResult, setMcpServerEnabled, testMcpServer } from '@/hermes' import { translateNow } from '@/i18n' import { classifyProbe, freshProbe, probeCache, probeKey } from '@/lib/mcp-probe-cache' -import { getServers } from '@/lib/mcp-servers' +import { getServers, serverEnabled } from '@/lib/mcp-servers' import { persistString, storedString } from '@/lib/storage' import { notify, notifyError } from '@/store/notifications' import { $activeGatewayProfile, normalizeProfileKey } from '@/store/profile' @@ -148,7 +148,7 @@ function recordResult(profileKey: string, name: string, status: McpHealthStatus) } const isUrlServer = (server: Record): boolean => - typeof server.url === 'string' && server.enabled !== false + typeof server.url === 'string' && serverEnabled(server) async function sweep(): Promise { const epoch = sweepEpoch diff --git a/hermes_cli/tools_config_mcp.py b/hermes_cli/tools_config_mcp.py index dd77eb3048..f167eca2ad 100644 --- a/hermes_cli/tools_config_mcp.py +++ b/hermes_cli/tools_config_mcp.py @@ -83,7 +83,9 @@ def _configure_mcp_tools_interactive(config: dict): _print_info("No MCP servers configured.") return - enabled_names = [k for k, v in mcp_servers.items() if v.get("enabled", True) not in {False, "false", "0", "no", "off"}] + from tools.mcp_tool_common import mcp_server_enabled + + enabled_names = [k for k, v in mcp_servers.items() if isinstance(v, dict) and mcp_server_enabled(v)] if not enabled_names: _print_info("All MCP servers are disabled.") return