Skip to main content
Glama

get_mac_app_path_proj

Retrieve the app bundle path for a macOS application by specifying the Xcode project file and scheme, enabling developers to locate built applications for testing or deployment.

Instructions

Gets the app bundle path for a macOS application using a project file. IMPORTANT: Requires projectPath and scheme. Example: get_mac_app_path_proj({ projectPath: '/path/to/project.xcodeproj', scheme: 'MyScheme' })

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
projectPathYesPath to the .xcodeproj file (Required)
schemeYesThe scheme to use (Required)
configurationNoBuild configuration (Debug, Release, etc.)
archNoArchitecture to build for (arm64 or x86_64). For macOS only.

Implementation Reference

  • Core execution logic for retrieving macOS app bundle path using xcodebuild -showBuildSettings to parse BUILT_PRODUCTS_DIR and FULL_PRODUCT_NAME.
    async function _handleGetAppPathLogic(params: {
      workspacePath?: string;
      projectPath?: string;
      scheme: string;
      configuration: string;
      platform: XcodePlatform;
      simulatorName?: string;
      simulatorId?: string;
      useLatestOS: boolean;
      arch?: string;
    }): Promise<ToolResponse> {
      log('info', `Getting app path for scheme ${params.scheme} on platform ${params.platform}`);
    
      try {
        // Create the command array for xcodebuild with -showBuildSettings option
        const command = ['xcodebuild', '-showBuildSettings'];
    
        // Add the workspace or project
        if (params.workspacePath) {
          command.push('-workspace', params.workspacePath);
        } else if (params.projectPath) {
          command.push('-project', params.projectPath);
        }
    
        // Add the scheme and configuration
        command.push('-scheme', params.scheme);
        command.push('-configuration', params.configuration);
    
        // Handle destination based on platform
        const isSimulatorPlatform = [
          XcodePlatform.iOSSimulator,
          XcodePlatform.watchOSSimulator,
          XcodePlatform.tvOSSimulator,
          XcodePlatform.visionOSSimulator,
        ].includes(params.platform);
    
        let destinationString = '';
    
        if (isSimulatorPlatform) {
          if (params.simulatorId) {
            destinationString = `platform=${params.platform},id=${params.simulatorId}`;
          } else if (params.simulatorName) {
            destinationString = `platform=${params.platform},name=${params.simulatorName}${params.useLatestOS ? ',OS=latest' : ''}`;
          } else {
            return createTextResponse(
              `For ${params.platform} platform, either simulatorId or simulatorName must be provided`,
              true,
            );
          }
        } else if (params.platform === XcodePlatform.macOS) {
          destinationString = constructDestinationString(
            params.platform,
            undefined,
            undefined,
            false,
            params.arch,
          );
        } else if (params.platform === XcodePlatform.iOS) {
          destinationString = 'generic/platform=iOS';
        } else if (params.platform === XcodePlatform.watchOS) {
          destinationString = 'generic/platform=watchOS';
        } else if (params.platform === XcodePlatform.tvOS) {
          destinationString = 'generic/platform=tvOS';
        } else if (params.platform === XcodePlatform.visionOS) {
          destinationString = 'generic/platform=visionOS';
        } else {
          return createTextResponse(`Unsupported platform: ${params.platform}`, true);
        }
    
        command.push('-destination', destinationString);
    
        // Execute the command directly
        const result = await executeCommand(command, 'Get App Path');
    
        if (!result.success) {
          return createTextResponse(`Failed to get app path: ${result.error}`, true);
        }
    
        if (!result.output) {
          return createTextResponse('Failed to extract build settings output from the result.', true);
        }
    
        const buildSettingsOutput = result.output;
        const builtProductsDirMatch = buildSettingsOutput.match(/BUILT_PRODUCTS_DIR = (.+)$/m);
        const fullProductNameMatch = buildSettingsOutput.match(/FULL_PRODUCT_NAME = (.+)$/m);
    
        if (!builtProductsDirMatch || !fullProductNameMatch) {
          return createTextResponse(
            'Failed to extract app path from build settings. Make sure the app has been built first.',
            true,
          );
        }
    
        const builtProductsDir = builtProductsDirMatch[1].trim();
        const fullProductName = fullProductNameMatch[1].trim();
        const appPath = `${builtProductsDir}/${fullProductName}`;
    
        let nextStepsText = '';
        if (params.platform === XcodePlatform.macOS) {
          nextStepsText = `Next Steps:
    1. Get bundle ID: get_macos_bundle_id({ appPath: "${appPath}" })
    2. Launch the app: launch_macos_app({ appPath: "${appPath}" })`;
        } else if (params.platform === XcodePlatform.iOSSimulator) {
          nextStepsText = `Next Steps:
    1. Get bundle ID: get_ios_bundle_id({ appPath: "${appPath}" })
    2. Boot simulator: boot_simulator({ simulatorUuid: "SIMULATOR_UUID" })
    3. Install app: install_app_in_simulator({ simulatorUuid: "SIMULATOR_UUID", appPath: "${appPath}" })
    4. Launch app: launch_app_in_simulator({ simulatorUuid: "SIMULATOR_UUID", bundleId: "BUNDLE_ID" })`;
        } else if (params.platform === XcodePlatform.iOS) {
          nextStepsText = `Next Steps:
    1. Get bundle ID: get_ios_bundle_id({ appPath: "${appPath}" })
    2. Use Xcode to install the app on your connected iOS device`;
        }
    
        return {
          content: [
            {
              type: 'text',
              text: `✅ App path retrieved successfully: ${appPath}`,
            },
            {
              type: 'text',
              text: nextStepsText,
            },
          ],
        };
      } catch (error) {
        const errorMessage = error instanceof Error ? error.message : String(error);
        log('error', `Error retrieving app path: ${errorMessage}`);
        return createTextResponse(`Error retrieving app path: ${errorMessage}`, true);
      }
    }
  • Defines and registers the 'get_mac_app_path_proj' tool, including schema, description, and handler wrapper that validates inputs and calls the core handler.
    export function registerGetMacOSAppPathProjectTool(server: McpServer): void {
      type Params = BaseProjectParams & { configuration?: string; arch?: string };
      registerTool<Params>(
        server,
        'get_mac_app_path_proj',
        "Gets the app bundle path for a macOS application using a project file. IMPORTANT: Requires projectPath and scheme. Example: get_mac_app_path_proj({ projectPath: '/path/to/project.xcodeproj', scheme: 'MyScheme' })",
        {
          projectPath: projectPathSchema,
          scheme: schemeSchema,
          configuration: configurationSchema,
          arch: archSchema,
        },
        async (params: Params) => {
          const projectValidation = validateRequiredParam('projectPath', params.projectPath);
          if (!projectValidation.isValid) return projectValidation.errorResponse!;
    
          const schemeValidation = validateRequiredParam('scheme', params.scheme);
          if (!schemeValidation.isValid) return schemeValidation.errorResponse!;
    
          return _handleGetAppPathLogic({
            ...params,
            configuration: params.configuration ?? 'Debug',
            platform: XcodePlatform.macOS,
            useLatestOS: true,
            arch: params.arch,
          });
        },
      );
    }
  • Zod schema for tool parameters: projectPath (required), scheme (required), optional configuration and arch.
      projectPath: projectPathSchema,
      scheme: schemeSchema,
      configuration: configurationSchema,
      arch: archSchema,
    },
  • Top-level registration entry that conditionally registers the tool during server setup via registerTools function.
    {
      register: registerGetMacOSAppPathProjectTool,
      groups: [ToolGroup.MACOS_WORKFLOW, ToolGroup.APP_DEPLOYMENT, ToolGroup.PROJECT_DISCOVERY],
      envVar: 'XCODEBUILDMCP_TOOL_GET_MACOS_APP_PATH_PROJECT',
    },

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/SampsonKY/XcodeBuildMCP'

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