UNPKG

jaxon-optimizely-dxp-mcp

Version:

AI-powered automation for Optimizely DXP - deploy, monitor, and manage environments through natural conversations

110 lines (95 loc) • 4.03 kB
/** * Project Switch Tool - Explicit project switching for Claude Desktop * Part of Jaxon Digital Optimizely DXP MCP Server */ const ProjectTools = require('./project-tools'); const ResponseBuilder = require('../response-builder'); class ProjectSwitchTool { /** * Switch to a specific project */ static async handleSwitchProject(args) { const { projectName } = args; if (!projectName) { return ResponseBuilder.error( 'āŒ Project name is required', 'switch-project', { error: 'Missing projectName parameter' } ); } // Attempt to switch project const result = ProjectTools.switchProject(projectName); if (!result.success) { // Get available projects for helpful error message const projects = ProjectTools.getConfiguredProjects(); const projectNames = projects.map(p => p.name).filter(Boolean); return ResponseBuilder.error( `āŒ Project "${projectName}" not found.\n\nAvailable projects:\n${projectNames.map(n => ` • ${n}`).join('\n')}\n\nšŸ’” Tip: Project names are case-insensitive`, 'switch-project', { requestedProject: projectName, availableProjects: projectNames } ); } // Set as last used project for session persistence ProjectTools.setLastUsedProject(projectName); // Get project details for confirmation const project = result.project; return ResponseBuilder.success( `āœ… **Switched to ${project.name}**\n\n` + `**Project Details**:\n` + `• Project ID: ${project.projectId || project.id}\n` + `• Environments: ${project.environments.join(', ')}\n` + `• Status: Active\n\n` + `šŸ“Œ All subsequent commands will use this project until you switch again.\n\n` + `šŸ’” **Tip**: You can also include the project name in any command:\n` + ` Example: \`list_deployments --project "${project.name}"\``, 'switch-project', { projectName: project.name, projectId: project.projectId || project.id, isDefault: project.isDefault || false } ); } /** * Get current active project */ static async handleGetCurrentProject(args) { // Check for last used project first const lastUsed = process.env.MCP_LAST_USED_PROJECT; let currentProject = null; if (lastUsed) { const result = ProjectTools.switchProject(lastUsed); if (result.success) { currentProject = result.project; } } // Fall back to default project if (!currentProject) { currentProject = ProjectTools.getCurrentProject(); } if (!currentProject) { return ResponseBuilder.error( 'āŒ No active project. Use `switch_project` to select a project.', 'current-project', {} ); } return ResponseBuilder.success( `šŸ“Œ **Current Project: ${currentProject.name}**\n\n` + `• Project ID: ${currentProject.projectId || currentProject.id}\n` + `• Environments: ${currentProject.environments.join(', ')}\n` + `${currentProject.isDefault ? '• Default: Yes ⭐\n' : ''}\n` + `šŸ’” Use \`switch_project\` to change projects`, 'current-project', { projectName: currentProject.name, projectId: currentProject.projectId || currentProject.id, isDefault: currentProject.isDefault || false } ); } } module.exports = ProjectSwitchTool;