Skip to main content
Glama

build

Build iOS Xcode projects and workspaces to compile code and identify errors for debugging and deployment.

Instructions

Build the iOS Xcode workspace/project in the folder

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
folderYesThe full path of the current folder that the iOS Xcode workspace/project sits

Implementation Reference

  • The main handler function for the 'build' tool (and 'test'). It changes to the specified folder, finds the Xcode project/workspace, determines the scheme and simulator, constructs the xcodebuild command, runs it, and returns the command and result summary (errors/warnings or success).
    @server.call_tool()
    async def call_tool(name, arguments: dict) -> list[TextContent]:
        try:
            args = Folder(**arguments)
        except ValueError as e:
            raise McpError(ErrorData(code=INVALID_PARAMS, message=str(e)))
        os.chdir(args.folder)
        xcode_project_path = find_xcode_project()
        project_name = os.path.basename(xcode_project_path)
        project_type = ""
        if xcode_project_path.endswith(".xcworkspace"):
            project_type = "-workspace"
        else:
            project_type = "-project"
    
        scheme = find_scheme(project_type, project_name)
        destination = find_available_simulator()
        command = ["xcodebuild",
                   project_type,
                   project_name,
                   "-scheme",
                   scheme,
                   "-destination",
                   destination]
        if name == "test":
            command.append("test")
    
        result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False).stdout
        
        lines = result.decode("utf-8").splitlines()
        error_lines = [line for line in lines if "error:" or "warning:" in line.lower()]
        error_message = "\n".join(error_lines)
        if not error_message:
            error_message = "Successful"
        return [
            TextContent(type="text", text=f"Command: {' '.join(command)}"),
            TextContent(type="text", text=f"{error_message}")
            ]
  • Pydantic BaseModel defining the input parameters for the 'build' tool: the folder path containing the Xcode project/workspace.
    class Folder(BaseModel):
        """Parameters"""
        folder: Annotated[str, Field(description="The full path of the current folder that the iOS Xcode workspace/project sits")]
  • Registers the 'build' tool (and 'test' tool) with the MCP server, providing name, description, and input schema.
    @server.list_tools()
    async def list_tools() -> list[Tool]:
        return [
            Tool(
                name = "build",
                description = "Build the iOS Xcode workspace/project in the folder",
                inputSchema = Folder.model_json_schema(),
            ),
            Tool(
                name="test",
                description="Run test for the iOS Xcode workspace/project in the folder",
                inputSchema=Folder.model_json_schema(),
            )
        ]
  • Helper function to find the nearest Xcode workspace (.xcworkspace) or project (.xcodeproj) directory by walking the current directory tree.
    def find_xcode_project():
        for root, dirs, files in os.walk("."):
            dirs.sort(reverse = True)
            for dir in dirs:
                if dir.endswith(".xcworkspace") or dir.endswith(".xcodeproj"):
                    return os.path.join(root, dir)
        return None
  • Helper function to find the first available scheme for the Xcode project/workspace by running 'xcodebuild -list'.
    def find_scheme(project_type: str, project_name: str) -> str:
        schemes_result = subprocess.run(["xcodebuild",
                                        "-list",
                                        project_type,
                                        project_name],
                                        stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE,
                                        check=False).stdout.decode("utf-8")
        
        schemes_lines = schemes_result.splitlines()
        schemes = []
        in_schemes_section = False
        for line in schemes_lines:
            if "Schemes:" in line:
                in_schemes_section = True
                continue
            if in_schemes_section:
                scheme = line.strip()
                if scheme:
                    schemes.append(scheme)
        
        if schemes:
            return schemes[0]
        else:
            return ""
Install Server

Other 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/ShenghaiWang/xcodebuild'

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