XcodeBuildMCPdocs
Install

Changelog

Release notes pulled live from the getsentry/XcodeBuildMCP GitHub releases feed and cached for one hour.

Release v2.6.2

June 2, 2026
latestView on GitHub ↗

Release v2.6.2

Fixed
  • Fixed xcodebuildmcp upgrade so update checks use the latest GitHub release as the canonical target instead of stale package-manager metadata, ensuring multi-version upgrades show release notes for the actual target version.
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.6.2

Release v2.6.1

June 2, 2026
View on GitHub ↗

Release v2.6.1

Fixed
  • Fixed tab bar item discovery so agents can switch UITabBar items (#439, #441).
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.6.1

Release v2.6.0

June 1, 2026
View on GitHub ↗

Release v2.6.0

New! Runtime UI automation

UI automation now hands your agent reusable context instead of just confirming an action ran. After a tap, swipe, type, wait, or batch, the result includes a compact snapshot of the foreground UI with stable element references and a screen hash, so the agent can pick the next control directly rather than taking another screenshot or re-running a full snapshot. Candidate controls are ranked from real accessibility data, and suggested next steps point at concrete element references instead of guessed coordinates.

In a deterministic Weather-app task, this cut wall-clock time by roughly 70%, token usage by roughly 68%, and total tool calls by roughly 76%.

New tools and options:

  • wait_for_ui polls the UI until a predicate is satisfied — existence, enabled state, focus, visible text, or settled layout.
  • batch performs a sequence of element-reference actions in one call, so agents can run several same-screen taps without a snapshot round-trip between each step.
  • drag performs element-reference drag gestures for expanding sheets and scrolling real list regions without coordinate guessing.
  • snapshot_ui now returns stable element references and a screen hash. Pass sinceScreenHash (MCP) / --since-screen-hash (CLI) to skip a full snapshot when the screen has not changed.
  • type_text accepts replaceExisting to replace a field's current value instead of appending to it.

See Tools Reference.

Added
  • Added follow-up nextSteps to machine-readable results so agents can act on suggested next actions without scraping prose. MCP structuredContent carries MCP tool-call hints and CLI --output json carries shell command lines. Result schemas that include nextSteps move to schema version 2; version 1 schema files remain available for existing validators. See Output Formats.
  • Added an opt-in XCODEBUILDMCP_HEADLESS_LAUNCH mode for automated runs that should not steal macOS focus: macOS apps launch in the background, the Simulator window is not brought to the foreground (the simulator runtime still boots), and keyboard-shortcut actions fail fast with a clear foreground-focus requirement. See Environment Variables.
Fixed
  • Fixed structured output so MCP clients that validate tool results can load every structured-output tool again. Published schemas are now self-contained, resolving validation failures such as PointerToNowhere in JSON Schema 2020-12 validators that do not re-base references across embedded schemas (#419, #423 by @Subharup-31).
  • Clarified debug_attach_sim PID attach arguments so the schema documents that pid must be used without bundleId or waitFor, and invalid pid + waitFor: true calls now fail validation before LLDB is invoked (#417).
  • Fixed simulator-name session defaults in the CLI so a name-only default resolves to a simulator ID for tools that take an ID, resolves before simulator lifecycle operations, and does not add conflicting simulator arguments to tools that already accept a name.
  • Fixed CLI JSON output so simulator-name resolution failures return the structured error envelope instead of plain stderr, and a launch failure during resolution is no longer reported as a macOS launch failure.
  • Fixed type_text so characters AXe cannot type, such as accented or other international characters, fail with a clear recoverable error before the field is focused instead of a generic typing failure.
  • Fixed CLI numeric array flags so comma-separated values such as --key-codes 23,18,14 are parsed as numbers instead of failing validation.

Various other internal improvements to stability, performance, and code quality.

Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.6.0

Release v2.5.2

May 12, 2026
View on GitHub ↗

Release v2.5.2

Changed
  • Updated the bundled AXe binary used by UI automation tools to 1.7.0.
Fixed
  • Fixed a log-capture vulnerability where a crafted bundleId or custom subsystem filter could broaden simulator log streams to capture output from other apps or Apple system subsystems. Bundle IDs and subsystem filters are now validated against a strict allowlist before reaching the predicate (#407 by @sebastiondev).
  • Fixed debug_attach_sim so an explicit pid overrides an inherited bundleId session default before mutual-exclusion validation (#410).
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.5.2

Release v2.5.1

May 8, 2026
View on GitHub ↗

Release v2.5.1

Fixed
  • Fixed portable macOS/Homebrew installs missing structured output schemas, which prevented MCP clients from loading tools.
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.5.1

Release v2.5.0

May 7, 2026
View on GitHub ↗

Release v2.5.0

Breaking
Standalone log-capture tools removed

The old logging workflow and its standalone log-capture tools (start_sim_log_cap, stop_sim_log_cap, start_device_log_cap, stop_device_log_cap, and launch_app_logs_sim) have been removed. This affects users, scripts, and agents that call those tool names directly.

Use the launch or build-and-run tools instead. They return runtime log paths as part of the normal result, so agents no longer need a separate start/stop log-capture sequence.

Before:

xcodebuildmcp logging start-sim-log-cap --simulator-id <UDID> --bundle-id com.example.MyApp
xcodebuildmcp simulator launch-app --simulator-id <UDID> --bundle-id com.example.MyApp
xcodebuildmcp logging stop-sim-log-cap --pid <PID>

After:

xcodebuildmcp simulator build-and-run --scheme MyApp --project-path ./MyApp.xcodeproj

# Or, for an app that is already installed on a simulator:
xcodebuildmcp simulator launch-app --simulator-id <UDID> --bundle-id com.example.MyApp

For MCP clients, use build_run_sim or launch_app_sim and read the returned runtime log path.

Runtime launch arguments now use launchArgs

Build-and-run and launch-only tools now separate build settings from app launch arguments. This affects users, scripts, and agents that previously passed runtime arguments through extraArgs or the launch-only args input.

If you do nothing, app runtime arguments may not reach the launched process, and launch-only calls that still use args will fail validation. Move app arguments to launchArgs; keep extraArgs only for xcodebuild flags and build setting overrides.

Before:

xcodebuildmcp simulator build-and-run --json '{
  "scheme": "MyApp",
  "projectPath": "./MyApp.xcodeproj",
  "extraArgs": ["--uitesting"]
}'

After:

xcodebuildmcp simulator build-and-run --json '{
  "scheme": "MyApp",
  "projectPath": "./MyApp.xcodeproj",
  "launchArgs": ["--uitesting"]
}'

Launch-only tools use the same input:

xcodebuildmcp simulator launch-app --json '{
  "simulatorId": "<UDID>",
  "bundleId": "com.example.MyApp",
  "launchArgs": ["--uitesting"]
}'

For MCP clients, use launchArgs on build_run_sim, build_run_device, build_run_macos, launch_app_sim, launch_app_device, and launch_mac_app. See CLI.

New! Structured outputs

XcodeBuildMCP now returns structured, machine-readable results across supported MCP clients and the CLI. Agents and scripts no longer have to scrape prose to find build status, log paths, bundle IDs, process IDs, test failures, or app paths. The human-readable text remains available, but every supported result now has a consistent envelope with the same fields:

{
  "schema": "xcodebuildmcp.output.build-run-result",
  "schemaVersion": "1",
  "didError": false,
  "error": null,
  "data": { }
}

For agents, this reduces token usage and makes tool results easier to act on reliably. Instead of rereading a full text transcript to find the build log, runtime log, or launched process, the agent can jump straight to fields such as data.artifacts.buildLogPath, data.artifacts.runtimeLogPath, data.artifacts.osLogPath, data.artifacts.appPath, data.artifacts.bundleId, and data.artifacts.processId.

MCP clients

MCP clients that support structured tool results receive structuredContent alongside the existing text response. The text remains useful for humans and older clients; supported clients can use the structured fields directly.

Example Build & Run result shape:

{
  "schema": "xcodebuildmcp.output.build-run-result",
  "schemaVersion": "1",
  "didError": false,
  "error": null,
  "data": {
    "summary": { "status": "SUCCEEDED", "durationMs": 1234, "target": "simulator" },
    "artifacts": {
      "appPath": "~/Library/Developer/XcodeBuildMCP/DerivedData/.../CalculatorApp.app",
      "bundleId": "io.sentry.calculatorapp",
      "processId": 99999,
      "buildLogPath": "~/Library/Developer/XcodeBuildMCP/logs/build_run_sim_...log",
      "runtimeLogPath": "~/Library/Developer/XcodeBuildMCP/logs/io.sentry.calculatorapp_...log",
      "osLogPath": "~/Library/Developer/XcodeBuildMCP/logs/io.sentry.calculatorapp_oslog_...log"
    }
  }
}
CLI JSON output

The CLI now supports --output text|json|jsonl|raw for tool commands. text remains the default. Use --output json when a script, CI job, or agent needs one final result document:

xcodebuildmcp simulator build-and-run --output json
{
  "schema": "xcodebuildmcp.output.build-run-result",
  "schemaVersion": "1",
  "didError": false,
  "error": null,
  "data": {
    "request": { "scheme": "CalculatorApp", "platform": "iOS Simulator" },
    "summary": { "status": "SUCCEEDED", "durationMs": 1234, "target": "simulator" },
    "artifacts": { "buildLogPath": "~/Library/Developer/XcodeBuildMCP/logs/build_run_sim_...log" },
    "diagnostics": { "warnings": [], "errors": [] }
  }
}

Use --output jsonl for live progress as newline-delimited JSON, one event per line:

{"event":"build-result.invocation","operation":"BUILD","request":{"scheme":"CalculatorApp","platform":"iOS Simulator"}}
{"event":"build-result.build-stage","operation":"BUILD","stage":"COMPILING","message":"Compiling CalculatorApp"}
{"event":"build-result.build-summary","operation":"BUILD","status":"SUCCEEDED","durationMs":3421}

Failures use the same envelope as successes, so callers can rely on didError, error, data.summary, data.diagnostics, and test-specific fields like testCases and testFailures instead of handling every command differently.

Published schemas

The structured result contracts are published as JSON Schema and can be used to validate output or generate types:

https://xcodebuildmcp.com/schemas/structured-output/<schema-name>/<version>.schema.json

For example: xcodebuildmcp.output.build-run-result v1. See Output Formats for the full reference.

Added
  • Added xcodebuildmcp upgrade to check for available updates and upgrade in place, with --check for report-only use and --yes/-y for non-interactive upgrades.
  • Added a platform-aware xcodebuildmcp setup wizard: choose macOS, iOS, tvOS, watchOS, or visionOS up front; get platform-appropriate workflow recommendations; skip simulator/device prompts for macOS-only projects; and reuse previous choices when re-running setup. Single-platform setups also include the platform in generated config and --format mcp-json output. See Setup (#365, based on work by @ichoosetoaccept).
  • Added XCODEBUILDMCP_CWD so MCP clients that cannot choose the server's start directory can still point project config discovery and relative-path resolution at the right workspace. See Environment Variables.
  • Added per-test timing output, so agents and scripts can identify slow tests without opening the full test report. JSON and structured results include a testCases list, and text output can show per-test durations with showTestTiming or XCODEBUILDMCP_SHOW_TEST_TIMING=1 (#339 by @codeman9).
  • Added default result bundles for simulator, device, macOS, and Swift Package test runs, so agents can inspect detailed test artifacts without manually choosing a result bundle path.
  • Added opt-in idle shutdown for unused MCP server processes via XCODEBUILDMCP_MCP_IDLE_TIMEOUT_MS, reducing leftover background processes for clients that keep server sessions open (#398). See Environment Variables.
  • Added toggle_software_keyboard and toggle_connect_hardware_keyboard tools for showing/hiding the iOS Simulator software keyboard and connecting/disconnecting the Mac hardware keyboard. See Tools Reference (#346, #347 by @yjmeqt).
  • Added tvOS, watchOS, and visionOS support to build_device, so physical-device builds are no longer limited to iOS. See Device Code Signing (#352 by @bitxeno).
Changed
  • CLI build and test commands now show live progress while they are running instead of waiting until the command finishes. See Output Formats.
  • CLI text output now shows file paths in a more readable Files: list by default. Use --file-path-render-style tree, filePathRenderStyle, or XCODEBUILDMCP_FILE_PATH_RENDER_STYLE if you prefer the compact tree layout used by MCP text responses (#402). See Output Formats.
  • Xcode IDE tool results are now shorter in final output, with full details still accessible when needed. CLI JSON and JSONL output now work for Xcode IDE tool calls too (#396).
  • Runtime log capture is more reliable across restarts, cleans itself up when apps stop or the server shuts down, and avoids stopping active log streams from another workspace (#382).
  • XcodeBuildMCP now cleans up old logs and temporary build artifacts more reliably without disrupting concurrent active sessions (#391).
  • Builds and tests now use an isolated DerivedData location per workspace or project when you have not set derivedDataPath, reducing cross-project build conflicts while keeping explicit derivedDataPath settings unchanged (#340, #341 by @codeman9).
  • Long-form documentation has moved to xcodebuildmcp.com/docs, with the README focused on installation, setup, and quick links to the hosted guides.
Fixed
  • Fixed shell-injection vulnerabilities when user-provided values were passed to Apple developer tools, log-capture queries, bundle ID extraction, and macOS launch flows (#289 by @sebastiondev, #390 by @voidborne-d).
  • Fixed a path traversal vulnerability that could allow reading files outside the expected scope.
  • Fixed portable macOS installs missing a required runtime dependency, which could make packaged installs fail when commands needed file matching.
  • Fixed configured paths that begin with ~ or ~/ so project, workspace, DerivedData, AXe, and template paths resolve under the user's home directory instead of creating literal ~ folders. Absolute configured paths are now normalized before use (#283, supersedes #301 by @trmquang93).
  • Fixed device build next-step guidance so agents no longer suggest unsupported --device-id or deviceId arguments (#287, #300 by @trmquang93, #350 by @MukundaKatta).
  • Fixed Xcode IDE manual disconnect immediately reconnecting after the user explicitly disconnected it (#343, #344 by @shaun0927).
  • Fixed simulator defaults refresh so stale simulator IDs are reconciled when both a simulator name and ID are configured, without rewriting shared project config files unnecessarily (#357).
  • Fixed session profile output so the persisted field accurately reflects whether a profile switch was saved.
  • Fixed long-running commands that could hang even after completing.
  • Fixed build and test failures after command startup returning incomplete output; they now finish with a clear error result and log paths.
  • Fixed final text and JSON results changing unexpectedly when commands also stream live progress (#360).
  • Fixed test result output so agents can find xcresult bundle paths after simulator, device, macOS, and Swift Package test runs (#397).
  • Fixed test summaries and progress output so CLI tests no longer show false compiler errors, mixed Swift Testing/XCTest suites are counted accurately, parameterized Swift Testing cases are not overcounted, and simulator test progress stays visible while tests run (#383, #392).
  • Fixed device tool calls that use session defaults so they no longer fail when platform is omitted.

Various other internal improvements to stability, performance, and code quality.

Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.5.0

Release v2.5.0-beta.1

April 30, 2026
pre-releaseView on GitHub ↗

Release v2.5.0-beta.1

Breaking
Legacy standalone log-capture tools removed

The old logging workflow and its standalone log-capture tools (start_sim_log_cap, stop_sim_log_cap, start_device_log_cap, stop_device_log_cap, and launch_app_logs_sim) have been removed. This affects users, scripts, and agents that call those tool names directly.

Use the launch or build-and-run tools instead. They return runtime log paths as part of the normal result, so agents no longer need a separate start/stop log-capture sequence.

Before:

xcodebuildmcp logging start-sim-log-cap --simulator-id <UDID> --bundle-id com.example.MyApp
xcodebuildmcp simulator launch-app --simulator-id <UDID> --bundle-id com.example.MyApp
xcodebuildmcp logging stop-sim-log-cap --pid <PID>

After:

xcodebuildmcp simulator build-and-run --scheme MyApp --project-path ./MyApp.xcodeproj

# Or, for an app that is already installed on a simulator:
xcodebuildmcp simulator launch-app --simulator-id <UDID> --bundle-id com.example.MyApp

For MCP clients, use build_run_sim, launch_app_sim, or build_run_device and read the returned runtime log path.

New! Structured outputs

XcodeBuildMCP now returns structured, machine-readable results across supported MCP clients and the CLI. Agents and scripts no longer have to scrape prose to find build status, log paths, bundle IDs, process IDs, test failures, or app paths. The human-readable text remains available, but every supported result now has a consistent envelope with the same frontmatter fields:

{
  "schema": "xcodebuildmcp.output.build-run-result",
  "schemaVersion": "1",
  "didError": false,
  "error": null,
  "data": { }
}

For agents, this reduces token usage and makes tool results easier to act on reliably. Instead of rereading a full text transcript to find the build log, runtime log, or launched process, the agent can jump straight to fields such as data.artifacts.buildLogPath, data.artifacts.runtimeLogPath, data.artifacts.osLogPath, data.artifacts.appPath, data.artifacts.bundleId, and data.artifacts.processId.

MCP clients

MCP clients that support structured tool results receive structuredContent alongside the existing text response. The text remains useful for humans and older clients; supported clients can use the structured fields directly.

Example Build & Run result shape:

{
  "schema": "xcodebuildmcp.output.build-run-result",
  "schemaVersion": "1",
  "didError": false,
  "error": null,
  "data": {
    "summary": { "status": "SUCCEEDED", "durationMs": 1234, "target": "simulator" },
    "artifacts": {
      "appPath": "~/Library/Developer/XcodeBuildMCP/DerivedData/.../CalculatorApp.app",
      "bundleId": "io.sentry.calculatorapp",
      "processId": 99999,
      "buildLogPath": "~/Library/Developer/XcodeBuildMCP/logs/build_run_sim_...log",
      "runtimeLogPath": "~/Library/Developer/XcodeBuildMCP/logs/io.sentry.calculatorapp_...log",
      "osLogPath": "~/Library/Developer/XcodeBuildMCP/logs/io.sentry.calculatorapp_oslog_...log"
    }
  }
}
CLI JSON output

The CLI now supports --output text|json|jsonl|raw for tool commands. text remains the default. Use --output json when a script, CI job, or agent needs one final result document:

xcodebuildmcp simulator build-and-run --output json
{
  "schema": "xcodebuildmcp.output.build-run-result",
  "schemaVersion": "1",
  "didError": false,
  "error": null,
  "data": {
    "request": { "scheme": "CalculatorApp", "platform": "iOS Simulator" },
    "summary": { "status": "SUCCEEDED", "durationMs": 1234, "target": "simulator" },
    "artifacts": { "buildLogPath": "~/Library/Developer/XcodeBuildMCP/logs/build_run_sim_...log" },
    "diagnostics": { "warnings": [], "errors": [] }
  }
}

Use --output jsonl for live progress as newline-delimited JSON, one event per line:

{"event":"build-result.invocation","operation":"BUILD","request":{"scheme":"CalculatorApp","platform":"iOS Simulator"}}
{"event":"build-result.build-stage","operation":"BUILD","stage":"COMPILING","message":"Compiling CalculatorApp"}
{"event":"build-result.build-summary","operation":"BUILD","status":"SUCCEEDED","durationMs":3421}

Failures use the same envelope as successes, so callers can rely on didError, error, data.summary, data.diagnostics, and test-specific fields like testCases and testFailures instead of handling every command differently.

Published schemas

The structured result contracts are published as JSON Schema and can be used to validate output or generate types:

https://xcodebuildmcp.com/schemas/structured-output/<schema-name>/<version>.schema.json

For example: xcodebuildmcp.output.build-run-result v1. See Output Formats for the full reference.

Added
  • Added xcodebuildmcp upgrade to check for available updates and upgrade in place, with --check for report-only use and --yes/-y for non-interactive upgrades.
  • Added a platform-aware xcodebuildmcp setup wizard: choose macOS, iOS, tvOS, watchOS, or visionOS up front; get platform-appropriate workflow recommendations; skip simulator/device prompts for macOS-only projects; and reuse previous choices when re-running setup. Single-platform setups also include the platform in generated config and --format mcp-json output. See Setup (#365, based on work by @ichoosetoaccept).
  • Added XCODEBUILDMCP_CWD so MCP clients that cannot choose the server's start directory can still point project config discovery and relative-path resolution at the right workspace.
  • Added per-test timing output for test runs. JSON and structured results now include a testCases list, and text output can show per-test durations with the showTestTiming config option or XCODEBUILDMCP_SHOW_TEST_TIMING=1 (#339 by @codeman9).
  • Added toggle_software_keyboard and toggle_connect_hardware_keyboard tools for showing/hiding the iOS Simulator software keyboard and connecting/disconnecting the Mac hardware keyboard. See Tools Reference (#346, #347 by @yjmeqt).
  • Added tvOS, watchOS, and visionOS support to build_device, so physical-device builds are no longer limited to iOS. See Device Code Signing (#352 by @bitxeno).
Changed
  • CLI build and test commands now show live progress while they are running instead of waiting until the command finishes. See Output Formats.
  • Runtime log capture is more reliable across server restarts and cleans itself up when apps stop or the server shuts down, reducing orphaned background log streams.
  • Builds and tests now use an isolated DerivedData location per workspace or project when you have not set derivedDataPath, reducing cross-project build conflicts while keeping explicit derivedDataPath settings unchanged (#340, #341 by @codeman9).
  • Long-form documentation has moved to xcodebuildmcp.com/docs, with the README focused on installation, setup, and quick links to the hosted guides.
Fixed
  • Fixed a shell injection vulnerability when user-provided values were passed to Apple developer tools and log-capture queries (#289 by @sebastiondev).
  • Fixed a path traversal vulnerability in structured-output schema loading so schema requests cannot read outside the bundled schema files.
  • Fixed configured paths that begin with ~ or ~/ so project, workspace, DerivedData, AXe, and template paths resolve under the user's home directory instead of creating literal ~ folders. Absolute configured paths are now normalized before use (#283, supersedes #301 by @trmquang93).
  • Fixed device build next-step guidance so agents no longer suggest unsupported --device-id or deviceId arguments (#287, #300 by @trmquang93, #350 by @MukundaKatta).
  • Fixed Xcode IDE manual disconnect immediately reconnecting after the user explicitly disconnected it (#343, #344 by @shaun0927).
  • Fixed simulator defaults refresh so stale simulator IDs are reconciled when both a simulator name and ID are configured, without rewriting shared project config files unnecessarily (#357).
  • Fixed session profile JSON output so callers can rely on persisted: true after persisting a profile switch.
  • Fixed some long-running commands hanging after the underlying Apple tool finished, especially when helper processes kept output streams open.
  • Fixed build and test failures after command startup returning incomplete output; they now finish with a clear error result and log paths.

Various other internal improvements to stability, performance, and code quality.

Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.5.0-beta.1

Release v2.3.2

March 31, 2026
View on GitHub ↗

Release v2.3.2

Fixed
  • Improved reliability of internal telemetry during shutdown (#302).
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.3.2

Release v2.3.1

March 27, 2026
View on GitHub ↗

Release v2.3.1

Fixed
  • Fixed unnecessary tool confirmation prompts in MCP clients (such as Codex) that treat missing approval annotations as high-risk defaults (#297).
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.3.1

Release v2.3.0

March 16, 2026
View on GitHub ↗

Release v2.3.0

Added
  • Added environment variable support for session defaults (e.g. XCODEBUILDMCP_WORKSPACE_PATH, XCODEBUILDMCP_SCHEME, XCODEBUILDMCP_PLATFORM) so MCP clients can supply startup defaults in their config without a project config file (#268 by @detailobsessed). See docs/CONFIGURATION.md.
  • Added --format mcp-json flag to xcodebuildmcp setup that exports an env-based MCP client config block instead of writing config.yaml (#268 by @detailobsessed).
Changed
  • Clarified configuration layering: session_set_defaults overrides config.yaml, which overrides environment variables. See docs/CONFIGURATION.md (#268 by @detailobsessed).
  • Improved xcodebuildmcp setup reliability when optional targets (like physical devices) are unavailable.
Fixed
  • Fixed .xcodebuildmcp/config.yaml being modified on startup when simulator metadata was refreshed (#230).
  • Fixed orphaned MCP server processes that could remain running after the client disconnects (#273).
  • Fixed list-schemes CLI command missing --project-path and --workspace-path flags (#271).
  • Fixed Xcode IDE workflow tools not working when invoked from the CLI.
  • Fixed Swift Package tools not properly waiting for process exit when stopping.
Option A — Homebrew (no Node.js required)

Install:

brew tap getsentry/xcodebuildmcp
brew install xcodebuildmcp

MCP config:

"XcodeBuildMCP": {
  "command": "xcodebuildmcp",
  "args": ["mcp"]
}
Option B — npm / npx (Node.js 18+)

Install:

npm install -g xcodebuildmcp@latest

MCP config:

"XcodeBuildMCP": {
  "command": "npx",
  "args": ["-y", "xcodebuildmcp@latest", "mcp"]
}

📦 NPM Package: https://www.npmjs.com/package/xcodebuildmcp/v/2.3.0

See every release on GitHub →