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 ""

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