MCP Hub
Back to servers

baepsae

Local MCP server for iOS Simulator and macOS app automation with a native Swift bridge

Registry
Updated
Feb 7, 2026

Quick Install

npx -y mcp-baepsae

mcp-baepsae

baepsae

Baepsae (Vinous-throated Parrotbill) — A tiny Korean bird. Round, chubby, and constantly hopping around chirping. Known for its grit — even when a little bird tries to keep up with a stork, it never gives up. This project is small too, but it pecks away at your simulators tirelessly.

Local MCP server for iOS Simulator and macOS app automation with a TypeScript MCP layer and a Swift native bridge.

한국어 문서는 README-KR.md를 참고하세요.

Table of Contents

Prerequisites

  • macOS 14+
  • Xcode + iOS Simulator
  • Node.js 18+
  • Swift 6+

Permissions

Accessibility permission is required for UI automation features (describe_ui, tap by ID).

  1. Open System Settings > Privacy & Security > Accessibility.
  2. Enable your terminal (Terminal, iTerm2, VSCode) or command runner (node, openclaw).
  3. If the app is missing, click + and add it manually.

Install

Option A) npm (easiest)

# Run directly without installing
npx mcp-baepsae

# Or install globally
npm install -g mcp-baepsae

On macOS, the Swift native binary is built automatically during install. If Swift is not available, the server still works with simctl-based features.

Option B) From source

git clone https://github.com/oozoofrog/mcp-baepsae.git
cd mcp-baepsae
npm install
npm run build

MCP Setup (Recommended)

Use the installer script that calls each client's MCP install flow directly.

bash scripts/install.sh --tool all

Client Matrix

ClientInstall PathScript TargetNotes
Claude Codeclaude mcp add--tool claude-codeSupports multi-scope via --claude-scope
Claude Desktopclaude mcp add --scope user--tool claude-desktopUser-level registration
Codex CLIcodex mcp add--tool codex-cliAlso works for Codex Desktop settings
Codex DesktopCodex CLI MCP config--tool codex-desktopUses same MCP registry as CLI
OpenCodeGlobal config (~/.config/opencode/opencode.json)--tool opencodeAuto-updated by installer
Geminigemini mcp add--tool geminiUser scope setup
Google AntigravityGemini-compatible MCP flow--tool antigravityUses Gemini MCP command path
GitHub Copilotcopilot or gh copilot session--tool copilotInteractive/session-based setup

For LLM

If you are an LLM agent setting up this MCP server, here is everything you need:

Quick start (one command)

# Register baepsae as an MCP server for all supported clients
bash scripts/install.sh --tool all

If you installed via npm instead of cloning the repo, use npx:

# Claude Code
claude mcp add baepsae -- npx -y mcp-baepsae

# Codex CLI
codex mcp add baepsae -- npx -y mcp-baepsae

Automation flags

# Preview commands without executing
bash scripts/install.sh --tool all --dry-run

# Verify environment and dependencies
bash scripts/install.sh --tool all --doctor

# Unregister from all clients
bash scripts/install.sh --tool all --uninstall

Runtime options

The installer supports multiple runtimes via --runtime:

FlagCommandWhen to use
--runtime node (default)node dist/index.jsLocal source build
--runtime npxnpx -y mcp-baepsaenpm registry, no global install
--runtime bunxbunx mcp-baepsaeBun users
--runtime globalmcp-baepsaeAfter npm install -g mcp-baepsae

Manual Setup (Fallback)

Use this when you do not want to run scripts/install.sh.

Using npx (recommended for npm users)

# Claude Code
claude mcp add baepsae -- npx -y mcp-baepsae

# Codex CLI
codex mcp add baepsae -- npx -y mcp-baepsae

# Gemini CLI
gemini mcp add --scope user --transport stdio baepsae npx -y mcp-baepsae

Using local build

# Claude Code (project)
claude mcp add --scope project --env="BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/baepsae-native" baepsae -- node /ABS/PATH/dist/index.js

# Codex CLI
codex mcp add baepsae --env BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/baepsae-native -- node /ABS/PATH/dist/index.js

# Gemini CLI
gemini mcp add --scope user --transport stdio -e BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/baepsae-native baepsae node /ABS/PATH/dist/index.js

Project Structure

  • MCP server: src/index.ts
  • Native binary project: native/
  • Native binary output: native/.build/release/baepsae-native
  • Tests: tests/mcp.contract.test.mjs, tests/mcp.real.test.mjs

Commands

npm run build       # Build TypeScript + native Swift binary
npm test            # Contract/integration tests
npm run test:real   # Real simulator smoke test (requires booted simulator)
npm run verify      # test + test:real
npm run setup:mcp   # Alias for scripts/install.sh

MCP Tool Status

32 tools implemented end-to-end, organized by platform:

iOS Simulator Only (11)

ToolDescription
list_simulatorsList available iOS simulators
screenshotCapture simulator screen
record_videoRecord simulator screen
stream_videoStream video frames
open_urlOpen URL in simulator (Safari/Deep Link)
install_appInstall .app or .ipa
launch_appLaunch app by Bundle ID
terminate_appTerminate running app
uninstall_appUninstall app
buttonHardware buttons (home, lock, side, siri, apple-pay)
gesturePreset gestures (scroll, swipe-edge)

macOS Only (4)

ToolDescription
list_appsList running macOS apps
scrollScroll wheel events
menu_actionExecute menu bar actions
get_focused_appGet focused app info

Cross-Platform — iOS Simulator + macOS (15)

ToolDescription
describe_uiAccessibility tree (pagination, filter, subtree, summary)
search_uiSearch UI elements by text/ID/label
tapTap by coordinates or element ID/label (supports double-click)
type_textType text input
swipeSwipe gesture
keyHID keycode input
key_sequenceSequential keycode input
key_comboModifier + key combination
touchTouch down/up events
right_clickRight-click by ID/label or coordinates
drag_dropDrag and drop
clipboardRead/write clipboard
list_windowsList app windows
activate_appBring app to foreground
screenshot_appCapture app window screenshot

Utility (2)

ToolDescription
baepsae_helpShow help info
baepsae_versionShow version info

Usage Examples

Open a URL (iOS Simulator):

// Open Naver Mobile
open_url({ udid: "...", url: "https://m.naver.com" })

Manage Apps (iOS Simulator):

// Install an app
install_app({ udid: "...", path: "/path/to/App.app" })

// Launch Safari
launch_app({ udid: "...", bundleId: "com.apple.mobilesafari" })

// Terminate Safari
terminate_app({ udid: "...", bundleId: "com.apple.mobilesafari" })

macOS App Automation:

// List running macOS apps
list_apps({})

// Take screenshot of a macOS app
screenshot_app({ bundleId: "com.apple.Safari" })

Troubleshooting

  • Invalid environment variable format on Claude setup:
    • Use current script (scripts/install.sh) or claude mcp add --env="KEY=value" ... format.
  • Missing native binary error:
    • Run npm run build and confirm native/.build/release/baepsae-native exists.
  • OpenCode does not show baepsae:
    • Re-run bash scripts/install.sh --tool opencode --skip-install --skip-build and check ~/.config/opencode/opencode.json.
  • Copilot not auto-registered:
    • Copilot MCP flow is interactive/session-based. Re-run installer with --interactive.
  • Real smoke test skipped:
    • Boot an iOS simulator first, then run npm run test:real.

Reviews

No reviews yet

Sign in to write a review