Skip to main content
Glama
atom2ueki

MCP Server for iOS Simulator

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
NameRequiredDescriptionDefault
sessionIdYes
xYes
yYes

Implementation Reference

  • 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 }; } }
  • 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() },
  • 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; } }

Other Tools

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

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