build
Compile iOS Xcode workspace/project from a specified folder path and report errors for further processing by LLM systems using the MCP server.
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:69-82 (registration)Registers the 'build' tool in the MCP server with name, description, and Folder 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:63-65 (schema)Pydantic model defining the input schema for the 'build' tool: requires 'folder' path.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:84-121 (handler)Handler function that implements the 'build' tool logic: validates input, finds project/scheme/simulator, runs xcodebuild, and returns output/errors. (Also handles 'test'.)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:19-25 (helper)Helper to find the Xcode workspace or project directory by walking the current folder.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-51 (helper)Helper to find the first available scheme for the Xcode project using 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 ""