/**
* MCP Tools definitions and handlers
*/
import { z } from "zod";
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
import type { MCPClient as MCSManagerClient } from "./api-client.js";
import * as SystemTools from "./tools/system.js";
import * as InstanceTools from "./tools/instance.js";
import * as FileTools from "./tools/file.js";
import * as ScheduleTools from "./tools/schedule.js";
import * as UserTools from "./tools/user.js";
// ============ Tool Schemas ============
// Export schemas for use in other files if needed
export const {
ListNodesSchema,
GetOverviewSchema
} = SystemTools;
export const {
CreateInstanceSchema,
UpdateInstanceConfigSchema,
SendCommandSchema,
UpdateInstanceSchema,
ReinstallInstanceSchema,
GetInstanceOutputLogSchema,
BatchInstancesSchema,
ListInstancesSchema,
InstanceOperationSchema,
DeleteInstanceSchema
} = InstanceTools;
export const {
ListFilesSchema,
CreateFolderSchema,
DeleteFilesSchema,
ReadFileSchema,
WriteFileSchema
} = FileTools;
export const {
ListSchedulesSchema,
CreateScheduleSchema,
DeleteScheduleSchema
} = ScheduleTools;
export const {
ListUsersSchema,
CreateUserSchema,
UpdateUserSchema,
DeleteUsersSchema
} = UserTools;
// ============ Tool Definitions ============
export const TOOL_DEFINITIONS = [
...SystemTools.systemToolDefinitions,
...InstanceTools.instanceToolDefinitions,
...FileTools.fileToolDefinitions,
...ScheduleTools.scheduleToolDefinitions,
...UserTools.userToolDefinitions,
];
export function listTools() {
return { tools: TOOL_DEFINITIONS };
}
// ============ Tool Handler ============
export async function handleToolCall(request: any, mcsmClient: MCSManagerClient) {
try {
const { name, arguments: args } = request.params;
// Add logging for debugging
console.log(`[MCP] Tool call received: ${name}`, JSON.stringify(args, null, 2));
switch (name) {
// System Tools
case "get_overview": return await SystemTools.handleGetOverview(args, mcsmClient);
case "list_nodes": return await SystemTools.handleListNodes(args, mcsmClient);
// Instance Tools
case "list_instances": return await InstanceTools.handleListInstances(args, mcsmClient);
case "get_instance_info": return await InstanceTools.handleGetInstanceInfo(args, mcsmClient);
case "get_instance_log": return await InstanceTools.handleGetInstanceLog(args, mcsmClient);
case "start_instance": return await InstanceTools.handleStartInstance(args, mcsmClient);
case "stop_instance": return await InstanceTools.handleStopInstance(args, mcsmClient);
case "restart_instance": return await InstanceTools.handleRestartInstance(args, mcsmClient);
case "kill_instance": return await InstanceTools.handleKillInstance(args, mcsmClient);
case "delete_instance": return await InstanceTools.handleDeleteInstance(args, mcsmClient);
case "create_instance": return await InstanceTools.handleCreateInstance(args, mcsmClient);
case "update_instance_config": return await InstanceTools.handleUpdateInstanceConfig(args, mcsmClient);
case "send_command": return await InstanceTools.handleSendCommand(args, mcsmClient);
case "update_instance": return await InstanceTools.handleUpdateInstance(args, mcsmClient);
case "reinstall_instance": return await InstanceTools.handleReinstallInstance(args, mcsmClient);
case "batch_start_instances": return await InstanceTools.handleBatchStartInstances(args, mcsmClient);
case "batch_stop_instances": return await InstanceTools.handleBatchStopInstances(args, mcsmClient);
case "batch_restart_instances": return await InstanceTools.handleBatchRestartInstances(args, mcsmClient);
case "batch_kill_instances": return await InstanceTools.handleBatchKillInstances(args, mcsmClient);
// File Tools
case "list_files": return await FileTools.handleListFiles(args, mcsmClient);
case "create_folder": return await FileTools.handleCreateFolder(args, mcsmClient);
case "delete_files": return await FileTools.handleDeleteFiles(args, mcsmClient);
case "read_file": return await FileTools.handleReadFile(args, mcsmClient);
case "write_file": return await FileTools.handleWriteFile(args, mcsmClient);
// Schedule Tools
case "list_schedules": return await ScheduleTools.handleListSchedules(args, mcsmClient);
case "create_schedule": return await ScheduleTools.handleCreateSchedule(args, mcsmClient);
case "delete_schedule": return await ScheduleTools.handleDeleteSchedule(args, mcsmClient);
// User Tools
case "list_users": return await UserTools.handleListUsers(args, mcsmClient);
case "create_user": return await UserTools.handleCreateUser(args, mcsmClient);
case "update_user": return await UserTools.handleUpdateUser(args, mcsmClient);
case "delete_users": return await UserTools.handleDeleteUsers(args, mcsmClient);
default:
console.log(`[MCP] Unknown tool called: ${name}`);
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
}
} catch (error) {
console.log(`[MCP] Tool call error: ${request.params.name}`, error);
if (error instanceof z.ZodError) {
throw new McpError(
ErrorCode.InvalidParams,
`Invalid parameters: ${error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ")}`
);
}
throw error;
}
}
export const toolSchemas = {
ListNodesSchema,
ListInstancesSchema,
InstanceOperationSchema,
DeleteInstanceSchema,
ListFilesSchema,
CreateFolderSchema,
DeleteFilesSchema,
ReadFileSchema,
WriteFileSchema,
ListSchedulesSchema,
CreateScheduleSchema,
DeleteScheduleSchema,
ListUsersSchema,
CreateUserSchema,
UpdateUserSchema,
DeleteUsersSchema,
GetOverviewSchema,
CreateInstanceSchema,
UpdateInstanceConfigSchema,
SendCommandSchema,
UpdateInstanceSchema,
ReinstallInstanceSchema,
GetInstanceOutputLogSchema,
BatchInstancesSchema,
};