shutdown-simulator
Shut down active iOS simulator sessions programmatically using session IDs for efficient session management and resource optimization.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes |
Implementation Reference
- src/mcp/mcp-server.ts:763-800 (registration)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; } }