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
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | The full path of the current folder that the iOS Xcode workspace/project sits |
Implementation Reference
- src/mcpxcodebuild/server.py:83-121 (handler)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}") ]
- src/mcpxcodebuild/server.py:63-65 (schema)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")]
- src/mcpxcodebuild/server.py:69-82 (registration)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(), ) ]
- src/mcpxcodebuild/server.py:19-25 (helper)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
- src/mcpxcodebuild/server.py:27-52 (helper)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 ""