Skip to content

Instantly share code, notes, and snippets.

@llk23r
Created February 22, 2026 08:38
Show Gist options
  • Select an option

  • Save llk23r/0dce33cf39909c83f6c2e32a40dbf095 to your computer and use it in GitHub Desktop.

Select an option

Save llk23r/0dce33cf39909c83f6c2e32a40dbf095 to your computer and use it in GitHub Desktop.
Script to manage the mcp proxy on Xcode
#!/bin/bash
# xcode-mcp-proxy-manager.sh — Xcode MCP proxy for Claude Code + Codex
#
# ./xcode-mcp-proxy-manager.sh on Start proxy, register with both CLIs
# ./xcode-mcp-proxy-manager.sh off Kill proxy, unregister from both CLIs
# ./xcode-mcp-proxy-manager.sh status Check proxy health + Xcode state
# ./xcode-mcp-proxy-manager.sh rollback Restore direct stdio (popups return)
set -euo pipefail
PORT=9876
URL="http://localhost:${PORT}/mcp"
NAME="xcode-proxy"
LOG="/tmp/xcode-mcp-proxy.log"
PROC_PATTERN="mcp-proxy.*${PORT}"
dismiss() { "$@" >/dev/null 2>&1 || true; }
has() { command -v "$1" >/dev/null 2>&1; }
case "${1:-}" in
on)
dismiss pkill -f "$PROC_PATTERN"
echo "Starting proxy... If Xcode shows a TCC dialog, click Allow."
mcp-proxy --port "$PORT" -- xcrun mcpbridge >"$LOG" 2>&1 &
disown
sleep 2
dismiss claude mcp remove xcode
dismiss claude mcp remove "$NAME"
claude mcp add --transport http --scope user "$NAME" "$URL" >/dev/null
if has codex; then
dismiss codex mcp remove xcode
dismiss codex mcp remove "$NAME"
codex mcp add --url "$URL" "$NAME" >/dev/null
fi
echo "Proxy ON (:${PORT}). Restart sessions."
;;
off)
dismiss pkill -f "$PROC_PATTERN"
dismiss claude mcp remove "$NAME"
has codex && dismiss codex mcp remove "$NAME"
echo "Proxy OFF."
;;
status)
printf "Proxy: "
curl -sf -o /dev/null -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"health","version":"1.0"}}}' \
&& echo "healthy" || echo "unreachable"
printf "Xcode: "; pgrep -q Xcode && echo "running" || echo "not running"
;;
rollback)
dismiss pkill -f "$PROC_PATTERN"
dismiss claude mcp remove "$NAME"
claude mcp add --transport stdio --scope user xcode -- xcrun mcpbridge >/dev/null
if has codex; then
dismiss codex mcp remove "$NAME"
codex mcp add xcode -- xcrun mcpbridge >/dev/null
fi
echo "Rolled back to direct stdio. Popups will return."
;;
*)
echo "Usage: $0 {on|off|status|rollback}"
exit 1
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment