tap
Simulate touch interactions on iOS simulators by sending precise X and Y coordinates via the Model Context Protocol, enabling programmatic control for testing and development.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | ||
| x | Yes | ||
| y | Yes |
Implementation Reference
- src/mcp/mcp-server.ts:424-455 (handler)The MCP tool handler function for the 'tap' tool. It validates input, calls the simulator manager's performTap method, and returns a success or error response.async ({ sessionId, x, y }) => { fileLogger.info(`Performing tap on simulator: ${sessionId}`, { x, y }); try { const success = await simulatorManager.performTap(sessionId, x, y); if (!success) { return { content: [{ type: 'text', text: `Failed to perform tap on session: ${sessionId}` }], isError: true }; } return { content: [{ type: 'text', text: `Tap performed at (${x}, ${y}) on session: ${sessionId}` }] }; } catch (error) { fileLogger.error(`Failed to perform tap on session: ${sessionId}`, { error }); return { content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } }
- src/mcp/mcp-server.ts:419-423 (schema)Zod schema defining the input parameters for the 'tap' tool: sessionId (string), x (number), y (number).{ sessionId: z.string(), x: z.number(), y: z.number() },
- src/mcp/mcp-server.ts:417-456 (registration)Registration of the 'tap' tool using McpServer.tool() method, specifying name, input schema, and handler function.this.server.tool( 'tap', { sessionId: z.string(), x: z.number(), y: z.number() }, async ({ sessionId, x, y }) => { fileLogger.info(`Performing tap on simulator: ${sessionId}`, { x, y }); try { const success = await simulatorManager.performTap(sessionId, x, y); if (!success) { return { content: [{ type: 'text', text: `Failed to perform tap on session: ${sessionId}` }], isError: true }; } return { content: [{ type: 'text', text: `Tap performed at (${x}, ${y}) on session: ${sessionId}` }] }; } catch (error) { fileLogger.error(`Failed to perform tap on session: ${sessionId}`, { error }); return { content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } } );
- Helper function in SimulatorManager that executes the actual tap gesture using the 'xcrun simctl io input tap' command on the target simulator UDID.async performTap(sessionId: string, x: number, y: number): Promise<boolean> { const session = this.sessions.get(sessionId); if (!session) { fileLogger.warn(`Session not found: ${sessionId}`); return false; } try { // Note: This is a simplified implementation // In a real-world scenario, you'd use more advanced methods from Appium await session.simulator.spawnProcess('xcrun', ['simctl', 'io', session.udid, 'input', 'tap', x.toString(), y.toString()]); fileLogger.info(`Tap performed at (${x}, ${y}) for session: ${sessionId}`); return true; } catch (error) { fileLogger.error(`Failed to perform tap for session: ${sessionId}`, { error }); return false; } }