You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
MCP channel ignores ~/.agent-device/config.json defaults (iosXctestrunFile): omitting the param on any tool call triggers the built-in runner build — even while an external-xctestrun runner for the same session is alive #1341
The CLI resolves iosXctestrunFile from ~/.agent-device/config.json, so on a machine set up with an external XCUITest runner artifact (#806) all CLI commands work with no extra flags.
The MCP channel does not apply those config defaults. Every MCP tool call must pass iosXctestrunFile explicitly; if it is omitted, the daemon falls back to the built-in runner build (xcodebuild build-for-testing) — even when a runner launched from the external xctestrun is already up and serving the very same session (request log shows ios_runner_session_reuse with "cache":"external" moments earlier).
On machines where the built-in build cannot sign — which is exactly the scenario the external-xctestrun escape hatch exists for (#806): no provisioning available, or Xcode not signed into an Apple ID — every omitted param costs a full failed build cycle:
Error (COMMAND_FAILED): xcodebuild build-for-testing failed
Hint: Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.
The same call with iosXctestrunFile passed explicitly succeeds immediately (snapshot returns the full accessibility tree; screenshot writes a valid PNG). So the external runner path works over MCP — the only gap is default resolution.
CLI sanity check: agent-device open <bundleId> --device <name> --platform ios then agent-device snapshot -i — works with no xctestrun flag; runner comes up from the external artifact.
Via MCP (Claude Code), call the snapshot tool withoutiosXctestrunFile (the session's external runner is still alive at this point).
Environment
CODE_SIGN_STYLE=Manual)agent-device mcp~/.agent-device/config.json:{ "iosXctestrunFile": "/Users/<user>/.agent-device/apple-runner/external-manual/Build/Products/AgentDeviceRunner_AgentDeviceRunnerUITests_iphoneos26.5-arm64.xctestrun" }Description
The CLI resolves
iosXctestrunFilefrom~/.agent-device/config.json, so on a machine set up with an external XCUITest runner artifact (#806) all CLI commands work with no extra flags.The MCP channel does not apply those config defaults. Every MCP tool call must pass
iosXctestrunFileexplicitly; if it is omitted, the daemon falls back to the built-in runner build (xcodebuild build-for-testing) — even when a runner launched from the external xctestrun is already up and serving the very same session (request log showsios_runner_session_reusewith"cache":"external"moments earlier).On machines where the built-in build cannot sign — which is exactly the scenario the external-xctestrun escape hatch exists for (#806): no provisioning available, or Xcode not signed into an Apple ID — every omitted param costs a full failed build cycle:
The same call with
iosXctestrunFilepassed explicitly succeeds immediately (snapshot returns the full accessibility tree; screenshot writes a valid PNG). So the external runner path works over MCP — the only gap is default resolution.Reproducible Demo
iosXctestrunFilein~/.agent-device/config.jsonpointing at an externally built xctestrun (feat(ios): support external xctest runner artifact #806).agent-device open <bundleId> --device <name> --platform iosthenagent-device snapshot -i— works with no xctestrun flag; runner comes up from the external artifact.snapshottool withoutiosXctestrunFile(the session's external runner is still alive at this point).