Skip to main content
Glama
JaxonDigital

Optimizely DXP MCP Server

by JaxonDigital

get_deployment_status

Monitor and track Optimizely DXP deployment progress to determine current status, view completion percentage, and obtain validation URLs for testing.

Instructions

📊 Get detailed deployment status and progress. REAL-TIME: <2s. Returns current status (InProgress, AwaitingVerification, Succeeded, Failed, Reset), progress percentage, and slot validation URL when status is AwaitingVerification. Set monitor=true to poll every 30s until reaches AwaitingVerification. Set waitBeforeCheck (seconds) to pause before checking status. Required: deploymentId. Agent workflow: After start_deployment() → poll status until AwaitingVerification → test slot URL → complete_deployment().

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
deploymentIdYes
waitBeforeCheckNoSeconds to wait before checking status (default: 0)
monitorNoEnable monitoring mode with AI guidance (default: false)
projectNameNo
projectIdNo
apiKeyNo
apiSecretNo

Implementation Reference

  • TypeScript interface defining the input arguments schema for the get_deployment_status tool, including optional parameters for authentication, project, deployment ID, polling options, and API URL.
    interface GetDeploymentStatusArgs {
        apiKey?: string;
        apiSecret?: string;
        projectId?: string;
        projectName?: string;
        deploymentId?: string;
        limit?: number;
        waitBeforeCheck?: number;
        monitor?: boolean;
        isNewDeployment?: boolean;
        apiUrl?: string;
    }
  • Main handler function for executing the get_deployment_status tool. Validates inputs, implements optional wait-before-check and monitoring features, fetches status via internal method, applies formatting, and handles errors.
    static async handleGetDeploymentStatus(args: GetDeploymentStatusArgs): Promise<any> {
        if (!args.apiKey || !args.apiSecret || !args.projectId) {
            return ResponseBuilder.invalidParams('Missing required parameters');
        }
    
        const { waitBeforeCheck = 0, monitor = false } = args;
    
        // Implement transparent wait-then-check pattern like database exports
        if (waitBeforeCheck > 0) {
            const { StructuredLogger } = require('../../structured-logger');
            const logger = new StructuredLogger({
                context: {
                    tool: 'wait_for_deployment',
                    deployment_id: args.deploymentId
                }
            });
    
            const waitMinutes = Math.floor(waitBeforeCheck / 60);
            const waitSeconds = waitBeforeCheck % 60;
            const waitDisplay = waitMinutes > 0 ?
                `${waitMinutes} minute${waitMinutes > 1 ? 's' : ''}${waitSeconds > 0 ? ` ${waitSeconds} second${waitSeconds > 1 ? 's' : ''}` : ''}` :
                `${waitSeconds} second${waitSeconds > 1 ? 's' : ''}`;
    
            logger.info('Waiting before checking deployment status', {
                wait_seconds: waitBeforeCheck,
                deployment_id: args.deploymentId
            });
            console.log(`⏳ Waiting ${waitDisplay} before checking deployment status...`);
    
            await new Promise(resolve => setTimeout(resolve, waitBeforeCheck * 1000));
    
            logger.info('Wait complete, checking deployment status', {
                deployment_id: args.deploymentId
            });
            console.log(`✅ Wait complete. Checking deployment status now...`);
        }
    
        try {
            const result = await this.getDeploymentStatus(args);
    
            // Check if result is already a structured response with data and message
            if (result && typeof result === 'object' && 'data' in result && 'message' in result) {
                // Add monitoring instructions if monitor mode is enabled
                if (monitor && result.data && result.data.status) {
                    const monitoringInstructions = this.generateMonitoringInstructions(
                        args.deploymentId!,
                        result.data.status,
                        result.data.percentComplete || 0,
                        args
                    );
                    result.message = result.message + '\n\n' + monitoringInstructions;
                }
                return ResponseBuilder.successWithStructuredData(result.data, result.message);
            }
    
            // Fallback for legacy string responses
            return ResponseBuilder.success(result);
        } catch (error: any) {
            console.error('Get deployment status error:', error);
            return ResponseBuilder.internalError('Failed to get deployment status', error.message);
        }
    }
  • Core helper method that performs the actual DXP REST API call to retrieve deployment status/data, handles single/multiple deployments, applies formatting, and provides detailed error handling.
    static async getDeploymentStatus(args: GetDeploymentStatusArgs): Promise<any> {
        const { apiKey, apiSecret, projectId, deploymentId, limit } = args;
    
        // Check if this is a newly created deployment (within last 30 seconds)
        // If the caller indicates this is a new deployment, add an initial delay
        if (args.isNewDeployment) {
            // Wait 3 seconds before first check to allow deployment to register
            await new Promise(resolve => setTimeout(resolve, 3000));
        }
    
        // DXP-101: Use REST API instead of PowerShell (3-10x faster, no PowerShell dependency)
        try {
            // Get deployment(s) directly from REST API
            const result: DeploymentResponse | DeploymentResponse[] = await DXPRestClient.getDeployments(
                projectId!,
                apiKey!,
                apiSecret!,
                deploymentId || null, // Pass deployment ID if checking specific deployment, null for all
                { apiUrl: args.apiUrl } // Support custom API URLs
            );
    
            // Format response based on whether we got single or multiple deployments
            if (Array.isArray(result)) {
                return DeploymentFormatters.formatMultipleDeployments(result as any, limit);
            } else if (result) {
                return DeploymentFormatters.formatSingleDeployment(result as any, args.projectName);
            }
    
            return {
                data: { deployments: [] },
                message: ResponseBuilder.addFooter('No deployment data available')
            };
    
        } catch (error: any) {
            // Handle REST API errors
            const errorDetails = {
                operation: 'Get Deployment Status',
                projectId,
                projectName: args.projectName,
                deploymentId,
                apiKey
            };
    
            // Check if this is an access denied error
            if (error.statusCode === 401 || error.statusCode === 403) {
                return ErrorHandler.formatError({
                    type: 'ACCESS_DENIED',
                    message: 'Access denied to deployment API',
                    statusCode: error.statusCode
                } as any, errorDetails);
            }
    
            // Generic error handling
            return ErrorHandler.formatError({
                type: 'API_ERROR',
                message: error.message,
                statusCode: error.statusCode
            } as any, errorDetails);
        }
    }
  • Helper function generating structured monitoring instructions for AI usage when monitor=true, tailored to deployment status, with recommended polling intervals and next-action guidance.
    static generateMonitoringInstructions(
        deploymentId: string,
        status: string,
        percentComplete: number,
        args: GetDeploymentStatusArgs
    ): string {
        let instructions = '';
    
        // Determine if deployment is still in progress
        // DXP-71: Added 'Completing' as transitional state
        const inProgressStatuses = ['InProgress', 'Resetting', 'Completing'];
        const awaitingVerificationStatuses = ['AwaitingVerification'];
        const completeStatuses = ['Succeeded', 'Failed', 'Reset'];
    
        if (completeStatuses.includes(status)) {
            // Deployment is complete - no more monitoring needed
            instructions += `---\n\n`;
            instructions += `✅ **Deployment Complete**\n\n`;
            instructions += `Final Status: **${status}**\n`;
            instructions += `Progress: **${percentComplete}%**\n\n`;
    
            if (status === 'AwaitingVerification') {
                instructions += `🔍 **Next Steps:**\n`;
                instructions += `• Review the deployment at verification URLs\n`;
                instructions += `• Use \`complete_deployment\` when ready to finalize\n`;
                instructions += `• Use \`reset_deployment\` to rollback if issues found\n`;
            } else if (status === 'Succeeded') {
                instructions += `🎉 Deployment completed successfully! No further action needed.\n`;
            } else if (status === 'Failed') {
                instructions += `⚠️ Deployment failed. Review logs and consider using \`reset_deployment\` to rollback.\n`;
            }
    
            instructions += `\n**AI: Stop monitoring - deployment is complete.**`;
    
        } else if (awaitingVerificationStatuses.includes(status)) {
            // Deployment awaiting verification
            instructions += `---\n\n`;
            instructions += `🔍 **Deployment Awaiting Verification**\n\n`;
            instructions += `The deployment has completed and is ready for review.\n\n`;
            instructions += `**Next Steps:**\n`;
            instructions += `1. Review the deployment at verification URLs\n`;
            instructions += `2. Use \`complete_deployment\` to finalize if everything looks good\n`;
            instructions += `3. Use \`reset_deployment\` to rollback if issues are found\n\n`;
            instructions += `**AI: Stop monitoring - deployment awaits user verification.**`;
    
        } else if (inProgressStatuses.includes(status)) {
            // Deployment still in progress - provide monitoring instructions
            instructions += `---\n\n`;
            instructions += `📊 **MONITORING INSTRUCTIONS FOR AI**\n\n`;
            instructions += `Deployment still in progress.\n`;
            instructions += `Deployment ID: ${deploymentId}\n`;
            instructions += `Current Status: ${status}\n`;
            instructions += `Progress: ${percentComplete}%\n\n`;
    
            // Use 30-second interval for deployments (faster than exports)
            const monitorInterval = 30; // 30 seconds
    
            instructions += `**To continue monitoring, use get_deployment_status with:**\n`;
            instructions += `• deploymentId: "${deploymentId}"\n`;
            instructions += `• waitBeforeCheck: ${monitorInterval} (waits ${monitorInterval} seconds then checks)\n`;
            instructions += `• monitor: true (enables monitoring prompts)\n`;
            instructions += `• projectName: "${args.projectName || ''}"\n`;
            instructions += `\n`;
            instructions += `**RECOMMENDED MONITORING PATTERN:**\n`;
            instructions += `1. Call get_deployment_status with:\n`;
            instructions += `   - deploymentId="${deploymentId}"\n`;
            instructions += `   - waitBeforeCheck=${monitorInterval}\n`;
            instructions += `   - monitor=true\n`;
            instructions += `2. If still InProgress, repeat with same interval\n`;
            instructions += `3. When AwaitingVerification, prompt user to verify\n`;
            instructions += `4. When Succeeded/Failed, stop monitoring\n\n`;
            instructions += `**Note:** Tool will wait ${monitorInterval} seconds then check automatically.\n`;
            instructions += `Deployments can take 30-90 minutes depending on complexity and size. Be patient and don't raise concerns unless status is Failed or stuck for several hours.`;
        }
    
        return instructions;
    }
  • Proxy handler in the DeploymentTools module that delegates to the implementation in deployment-list.ts, serving as the exported entry point for tool registration.
    static async handleGetDeploymentStatus(args: any): Promise<any> {
        return DeploymentListOperations.handleGetDeploymentStatus(args);
    }
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it discloses performance ('REAL-TIME: <2s'), polling behavior ('poll every 30s until reaches AwaitingVerification'), and workflow dependencies. It doesn't mention rate limits, authentication needs, or error handling, but provides substantial behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: first sentence states purpose, second adds performance and return details, third explains monitoring behavior, fourth covers workflow. Every sentence adds value with zero waste, and it's appropriately front-loaded with core functionality.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no annotations, and no output schema, the description does well: it explains the deployment workflow, monitoring behavior, and key parameters. It doesn't fully document all parameters or the exact return format, but provides enough context for effective use given the complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (29%), but the description compensates by explaining key parameters: 'deploymentId' is required, 'monitor=true' enables polling, and 'waitBeforeCheck' pauses before checking. It doesn't cover 'projectName', 'projectId', 'apiKey', or 'apiSecret', but adds meaningful context for the most critical parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get detailed deployment status and progress' with specific status values (InProgress, AwaitingVerification, etc.) and what information is returned. It distinguishes from siblings like 'list_deployments' (which lists deployments) and 'complete_deployment' (which finalizes deployments).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Agent workflow: After start_deployment() → poll status until AwaitingVerification → test slot URL → complete_deployment()' and mentions when to use monitoring mode. It distinguishes this tool from 'complete_deployment' and 'reset_deployment' by explaining its role in the deployment workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JaxonDigital/optimizely-dxp-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server