Skip to main content
Glama
rainhan99

Cloud Manage MCP Server

by rainhan99

power_off_digitalocean_droplet

Shuts down a DigitalOcean droplet after confirming its ID, IP address, and name to prevent accidental power-offs. This tool helps manage cloud server operations through the Cloud Manage MCP Server.

Instructions

强制关闭DigitalOcean Droplet(需要三次确认)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
droplet_idYes
ip_confirmationNo
name_confirmationNo
operation_confirmationNo

Implementation Reference

  • main.py:419-430 (registration)
    MCP tool registration and thin handler wrapper that delegates to DigitalOcean provider's power_off_droplet method with security confirmation parameters.
    def power_off_digitalocean_droplet( droplet_id: int, ip_confirmation: str = "", name_confirmation: str = "", operation_confirmation: str = "" ) -> Dict: """ 强制关闭DigitalOcean Droplet(需要三次确认) """ return digitalocean_provider.power_off_droplet( droplet_id, ip_confirmation, name_confirmation, operation_confirmation )
  • Core handler logic for all DigitalOcean power operations ('power_on', 'power_off', etc.), including triple confirmation validation using SecurityConfirmation, droplet info fetch, and API call to client.droplet_actions.post for executing the power action.
    def _execute_power_operation( self, droplet_id: int, operation: str, ip_confirmation: str, name_confirmation: str, operation_confirmation: str ) -> Dict: """ 执行电源操作的通用函数 """ if not self.available: return { 'error': f'DigitalOcean服务不可用: {getattr(self, "error", "未知错误")}', 'provider': 'digitalocean' } # 首先获取droplet信息 try: droplet_response = self.client.droplets.get(droplet_id) droplet = droplet_response.get("droplet", {}) if not droplet: return { 'error': f'未找到ID为 {droplet_id} 的Droplet', 'provider': 'digitalocean' } # 格式化droplet信息用于确认 droplet_info = self._format_droplet_for_confirmation(droplet) except Exception as e: return { 'error': f'获取Droplet信息时发生错误: {str(e)}', 'provider': 'digitalocean' } # 检查是否提供了确认信息 if not ip_confirmation or not name_confirmation or not operation_confirmation: # 返回确认要求 return require_triple_confirmation(droplet_info, operation) # 验证确认信息 security = SecurityConfirmation() is_valid, error_message = security.validate_power_operation( droplet_info, operation, ip_confirmation, name_confirmation, operation_confirmation ) if not is_valid: return { 'error': f'确认验证失败: {error_message}', 'provider': 'digitalocean', 'requires_confirmation': True } # 执行实际操作 try: action_data = {"type": operation} response = self.client.droplet_actions.post(droplet_id=droplet_id, body=action_data) action = response.get("action", {}) return { 'provider': 'digitalocean', 'droplet_id': droplet_id, 'operation_success': True, 'action': { 'id': action.get("id"), 'status': action.get("status"), 'type': action.get("type"), 'started_at': action.get("started_at"), 'resource_id': action.get("resource_id") }, 'message': f'已成功提交 {operation} 操作,操作ID: {action.get("id")}', 'confirmation_validated': True } except Exception as e: return { 'error': f'执行 {operation} 操作时发生错误: {str(e)}', 'provider': 'digitalocean' }
  • Security helper that validates the triple confirmation (IP, instance name, operation type) required before executing destructive power operations.
    def validate_power_operation( instance_info: Dict, operation: str, ip_confirmation: str, name_confirmation: str, operation_confirmation: str ) -> Tuple[bool, str]: """ 验证电源操作的三次确认 Args: instance_info (dict): 实例信息 operation (str): 操作类型 ('shutdown', 'reboot', 'power_off', 'power_on') ip_confirmation (str): 用户确认的IP地址 name_confirmation (str): 用户确认的实例名称 operation_confirmation (str): 用户确认的操作类型 Returns: Tuple[bool, str]: (是否通过验证, 错误信息) """ errors = [] # 获取实例的实际信息 actual_ip = instance_info.get('public_ip', instance_info.get('public_ipv4', '未知')) actual_name = instance_info.get('name', instance_info.get('instance_name', '未知')) # 第一次确认:IP地址 if ip_confirmation.strip() != actual_ip: errors.append(f"IP地址确认失败: 期望 '{actual_ip}', 但收到 '{ip_confirmation}'") # 第二次确认:实例名称 if name_confirmation.strip() != actual_name: errors.append(f"实例名称确认失败: 期望 '{actual_name}', 但收到 '{name_confirmation}'") # 第三次确认:操作类型 valid_operations = { 'shutdown': ['shutdown', '关机', '优雅关机'], 'power_off': ['power_off', '强制关机', '强制断电'], 'reboot': ['reboot', '重启', '重新启动'], 'power_on': ['power_on', '开机', '启动'] } operation_confirmed = False for op, variations in valid_operations.items(): if op == operation and operation_confirmation.strip().lower() in [v.lower() for v in variations]: operation_confirmed = True break if not operation_confirmed: expected_ops = valid_operations.get(operation, [operation]) errors.append(f"操作确认失败: 期望 '{expected_ops[0]}', 但收到 '{operation_confirmation}'") if errors: return False, "; ".join(errors) return True, "所有确认项目验证通过"
  • Provider-specific entry point for power_off operation that specifies the operation type 'power_off' and delegates to the shared _execute_power_operation helper.
    def power_off_droplet( self, droplet_id: int, ip_confirmation: str = "", name_confirmation: str = "", operation_confirmation: str = "" ) -> Dict: """ 强制关闭Droplet(需要三次确认) """ return self._execute_power_operation( droplet_id, 'power_off', ip_confirmation, name_confirmation, operation_confirmation )

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/rainhan99/cloud_manage_mcp_server'

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