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;
      }
    }
Install Server

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