Skip to main content
Glama

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
NameRequiredDescriptionDefault
folderYesThe full path of the current folder that the iOS Xcode workspace/project sits

Implementation Reference

  • 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(), ) ]
  • 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")]
  • 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}") ]
  • 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
  • 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 ""

Other Tools

Related 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