From b4301285e56f26c960009fe8dbfd4f9d5c5d7ace Mon Sep 17 00:00:00 2001 From: bot-hermes Date: Tue, 8 Sep 2026 15:32:00 +0000 Subject: [PATCH] fix: execute tool param mapping + docker-compose port 9801 - execute: map each operation to correct Komodo API param key (stack ops use 'stack', build ops use 'build', etc.) - execute: container ops pass server alongside container name - docker-compose: use host port 9801 to avoid conflict with existing bare node process on 9800 --- docker-compose.yml | 2 +- .../test_all_tools.cpython-314.pyc | Bin 0 -> 47798 bytes src/tools/execute.ts | 113 ++++++++++++++---- 3 files changed, 93 insertions(+), 22 deletions(-) create mode 100644 scripts/__pycache__/test_all_tools.cpython-314.pyc diff --git a/docker-compose.yml b/docker-compose.yml index 1556f42..fc8da7e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ services: build: . container_name: komodo-mcp-server ports: - - "9800:9800" + - "9801:9800" environment: - KOMODO_BASE_URL=${KOMODO_BASE_URL:-http://10.10.2.114:9120} - KOMODO_API_KEY=${KOMODO_API_KEY} diff --git a/scripts/__pycache__/test_all_tools.cpython-314.pyc b/scripts/__pycache__/test_all_tools.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16103071ffcaaf86ab5c6c391756f08b9e9d58d4 GIT binary patch literal 47798 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 literal 0 HcmV?d00001 diff --git a/src/tools/execute.ts b/src/tools/execute.ts index 97338ad..4a98145 100644 --- a/src/tools/execute.ts +++ b/src/tools/execute.ts @@ -2,24 +2,95 @@ import { z } from "zod"; import { KomodoClient } from "../komodo-client.js"; import { ExecuteOperation, EXECUTE_REQUEST_MAP } from "../types.js"; -// Operations that need {server: } instead of {id: } -const SERVER_SCOPED_OPS = new Set([ - "run_server_prune_images", - "run_server_prune_containers", - "run_server_prune_networks", - "rotate_all_server_keys", - "prune_buildx", - "prune_docker_builders", - "prune_system", - "prune_volumes", - "delete_image", - "delete_network", - "delete_volume", +// Maps each operation to the Komodo API param key for the id field. +// Most operations use their entity type as the key (e.g. "stack", "build"). +const OPERATION_PARAM_KEY: Record = { + // Build + run_build: "build", + cancel_build: "build", + // Stack + deploy_stack: "stack", + deploy_stack_service: "stack", + deploy_stack_if_changed: "stack", + destroy_stack: "stack", + pull_stack: "stack", + start_stack: "stack", + stop_stack: "stack", + restart_stack: "stack", + pause_stack: "stack", + unpause_stack: "stack", + // Deployment + deploy: "deployment", + destroy_deployment: "deployment", + pull_deployment: "deployment", + start_deployment: "deployment", + stop_deployment: "deployment", + restart_deployment: "deployment", + pause_deployment: "deployment", + unpause_deployment: "deployment", + // Repo + build_repo: "repo", + clone_repo: "repo", + pull_repo: "repo", + cancel_repo_build: "repo", + clear_repo_cache: "repo", + // Procedure & Action + run_procedure: "procedure", + cancel_procedure: "procedure", + run_action: "action", + cancel_action: "action", + run_sync: "sync", + // Container (need both container + server) + start_container: "container", + stop_container: "container", + restart_container: "container", + pause_container: "container", + unpause_container: "container", + destroy_container: "container", + // Server-scoped (prune, delete, rotate, etc.) + run_server_prune_images: "server", + run_server_prune_containers: "server", + run_server_prune_networks: "server", + rotate_all_server_keys: "server", + prune_buildx: "server", + prune_docker_builders: "server", + prune_system: "server", + prune_volumes: "server", + delete_image: "server", + delete_network: "server", + delete_volume: "server", + // Batch ops — use "ids" array, not single id + batch_run_build: "ids", + batch_deploy_stack: "ids", + batch_deploy_stack_if_changed: "ids", + batch_deploy: "ids", + batch_pull_stack: "ids", + batch_pull_repo: "ids", + batch_build_repo: "ids", + batch_clone_repo: "ids", + batch_run_procedure: "ids", + batch_run_action: "ids", + batch_destroy_deployment: "ids", + batch_destroy_stack: "ids", + // Admin + backup_core_database: "_none", + rotate_core_keys: "_none", + global_auto_update: "_none", + send_alert: "alert", + test_alerter: "alerter", +}; + +// Operations that need {server: } alongside the entity param +const NEEDS_SERVER_PARAM = new Set([ + "start_container", "stop_container", "restart_container", + "pause_container", "unpause_container", "destroy_container", + "start_all_containers", "stop_all_containers", "restart_all_containers", + "pause_all_containers", "unpause_all_containers", ]); export const executeInputSchema = { operation: ExecuteOperation.describe( - "Execute operation. Server-scoped ops (prune_*, delete_*) require the server name in the id field. RunSync requires the sync name/id in the id field.", + "Execute operation. Pass the resource name/id in the id field. Server-scoped ops (prune_*, delete_*) require the server name. Batch ops ignore id.", ), id: z.string().optional().describe("Resource ID, name, or server name (depends on operation)"), params: z @@ -44,13 +115,13 @@ export async function handleExecute( } const requestParams: Record = { ...params }; - if (id) { - if (SERVER_SCOPED_OPS.has(operation)) { - requestParams.server = id; - } else if (operation === "run_sync") { - requestParams.sync = id; - } else { - requestParams.id = id; + const paramKey = OPERATION_PARAM_KEY[operation]; + + if (id && paramKey && paramKey !== "_none" && paramKey !== "ids") { + requestParams[paramKey] = id; + // Container ops also need server in params + if (NEEDS_SERVER_PARAM.has(operation) && params?.server) { + requestParams.server = params.server; } }