Skip to main content
Glama
atom2ueki

MCP Server for iOS Simulator

shutdown-simulator

Shut down active iOS simulator sessions programmatically using session IDs for efficient session management and resource optimization.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sessionIdYes

Implementation Reference

  • MCP tool registration for 'shutdown-simulator'. Includes Zod input schema requiring 'sessionId' and handler function that calls simulatorManager.shutdownSimulator and returns formatted text response.
    this.server.tool(
      'shutdown-simulator',
      {
        sessionId: z.string()
      },
      async ({ sessionId }) => {
        fileLogger.info(`Shutting down simulator: ${sessionId}`);
        try {
          const success = await simulatorManager.shutdownSimulator(sessionId);
          
          if (!success) {
            return {
              content: [{
                type: 'text',
                text: `Failed to shutdown simulator for session: ${sessionId}`
              }],
              isError: true
            };
          }
          
          return {
            content: [{
              type: 'text',
              text: `Simulator shutdown for session: ${sessionId}`
            }]
          };
        } catch (error) {
          fileLogger.error(`Failed to shutdown simulator for session: ${sessionId}`, { error });
          return {
            content: [{
              type: 'text',
              text: `Error: ${error instanceof Error ? error.message : String(error)}`
            }],
            isError: true
          };
        }
      }
    );
  • Main handler logic for shutting down a simulator session. Attempts shutdown via appium-ios-simulator API first, falls back to 'xcrun simctl shutdown' CLI command if needed, and verifies the simulator is no longer booted.
    async shutdownSimulator(sessionId: string): Promise<boolean> {
      const session = this.sessions.get(sessionId);
      if (!session) {
        fileLogger.warn(`Session not found: ${sessionId}`);
        return false;
      }
    
      try {
        // Try the simulator object method first
        fileLogger.info(`Attempting to shut down simulator (via API) for session: ${sessionId}, UDID: ${session.udid}`);
        
        try {
          await session.simulator.shutdown();
          fileLogger.info(`Simulator API shutdown successful for session: ${sessionId}`);
        } catch (innerError) {
          fileLogger.warn(`API shutdown failed, falling back to CLI for session: ${sessionId}`, { innerError });
          // If the simulator object method fails, try direct CLI
          await this.directShutdownByUDID(session.udid);
        }
        
        // Verify the shutdown was successful
        let verifySuccess = await this.verifySimulatorShutdown(session.udid);
        
        // If not, try the CLI approach as a fallback
        if (!verifySuccess) {
          fileLogger.warn(`Simulator still running, trying direct CLI shutdown for session: ${sessionId}`);
          await this.directShutdownByUDID(session.udid);
          verifySuccess = await this.verifySimulatorShutdown(session.udid);
        }
        
        if (verifySuccess) {
          fileLogger.info(`Simulator successfully shutdown for session: ${sessionId}`);
          return true;
        } else {
          fileLogger.warn(`Simulator may still be running for session: ${sessionId}`);
          return false;
        }
      } catch (error) {
        fileLogger.error(`Failed to shutdown simulator for session: ${sessionId}`, { error });
        return false;
      }
    }
  • Helper function that executes the direct CLI shutdown command 'xcrun simctl shutdown ${udid}' used as fallback in shutdownSimulator.
    async directShutdownByUDID(udid: string): Promise<boolean> {
      fileLogger.info(`Attempting direct CLI shutdown for simulator: ${udid}`);
      try {
        const execAsync = promisify(exec);
        await execAsync(`xcrun simctl shutdown ${udid}`);
        fileLogger.info(`Direct CLI shutdown command completed for simulator: ${udid}`);
        return true;
      } catch (error) {
        fileLogger.error(`Failed direct CLI shutdown for simulator: ${udid}`, { error });
        return false;
      }
    }

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/atom2ueki/mcp-server-ios-simulator'

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