# io.github.oozoofrog/baepsae (npm · mcp-baepsae)

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

- Trust score: 76/100 (medium)
- Change this week: +30
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `mcp-baepsae`: 76/100 (this document), [markdown](https://verifymcp.io/servers/oozoofrog-baepsae/mcp-baepsae.md), [page](https://verifymcp.io/servers/oozoofrog-baepsae/mcp-baepsae)

## Channel facts

- Registry: `npm`
- Package: `mcp-baepsae`
- Version: `6.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 80/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
  - Runs a script at install time (postinstall) that we could not recognise. It may be perfectly ordinary, but we do not read the published tarball, so we cannot say what it does.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to oozoofrog/mcp-baepsae).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 124 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 70/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 4194 tokens (~89/item across 47 items; 47 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add oozoofrog-baepsae -- npx -y mcp-baepsae
```

### Codex

```bash
codex mcp add oozoofrog-baepsae -- npx -y mcp-baepsae
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "oozoofrog-baepsae": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "mcp-baepsae"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add oozoofrog-baepsae --command npx --arg -y --arg mcp-baepsae
```

### Hermes

```yaml
mcp_servers:
  oozoofrog-baepsae:
    command: "npx"
    args: ["-y", "mcp-baepsae"]
```

### Other

```json
{
  "mcpServers": {
    "oozoofrog-baepsae": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-baepsae"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 76, +4)

- [functional improvement] Stability: unverified → 0.23

### 2026-08-02 (score 72, +67)

- [security improvement] Install scripts: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [security] The scripts that run when this package is installed changed: postinstall
- [security] The attested source repository moved: oozoofrog/mcp-baepsae
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 5, −23)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 28, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-30 (score 46, +22)

- [functional improvement] Tool coverage: unverified → 100

### 2026-07-28 (score 24, −22)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (47)

### `baepsae_help` (~39 tokens)

Show help. Optionally pass subcommand name for compatibility reference.

Input parameters:

- `subcommand` (string): Optional legacy subcommand name for compatibility reference

### `baepsae_version` (~17 tokens)

Show server and native binary versions.

### `doctor` (~31 tokens)

Run readiness self-checks for host process, parent process, native binary, booted simulator availability, and accessibility permission.

### `list_apps` (~18 tokens)

List running macOS applications with their bundle IDs.

### `get_focused_app` (~20 tokens)

Get information about the currently focused macOS app.

### `list_simulators` (~17 tokens)

List available simulators using simctl.

### `open_url` (~44 tokens)

Open a URL in the simulator (e.g. Safari or deep link).

Input parameters:

- `udid` (string, required): Simulator UDID
- `url` (string, required): URL to open

### `install_app` (~47 tokens)

Install an app (.app, .ipa) on the simulator.

Input parameters:

- `path` (string, required): Path to .app or .ipa file
- `udid` (string, required): Simulator UDID

### `uninstall_app` (~45 tokens)

Uninstall an app from the simulator.

Input parameters:

- `bundleId` (string, required): App Bundle Identifier (e.g. com.example.app)
- `udid` (string, required): Simulator UDID

### `launch_app` (~60 tokens)

Launch an installed app on the simulator.

Input parameters:

- `args` (array): Arguments to pass to the app
- `bundleId` (string, required): App Bundle Identifier
- `env` (object): Environment variables
- `udid` (string, required): Simulator UDID

### `terminate_app` (~39 tokens)

Terminate a running app on the simulator.

Input parameters:

- `bundleId` (string, required): App Bundle Identifier
- `udid` (string, required): Simulator UDID

### `analyze_ui` (~272 tokens)

Describe app UI hierarchy. Works with both simulator (udid) and macOS (bundleId/appName) targets.

Input parameters:

- `all` (boolean): Include all elements (system UI, bezels)
- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `focusId` (string): Focus on element with specific ID
- `limit` (integer): Maximum number of nodes to return
- `maxDepth` (integer): Maximum tree traversal depth
- `offset` (integer): Pagination start position (0-based node index)
- `output` (string): Optional output file path for hierarchy text
- `page` (integer): Page number (0-based)
- `pageSize` (integer): Page size for paginated child access
- `role` (string): Filter by AX role (e.g. AXButton, AXStaticText)
- `rootElementId` (string): Only traverse subtree under this element ID
- `summary` (boolean): Summary mode — collapse children as [N children]
- `udid` (string): Simulator UDID (for simulator targets)
- `visibleOnly` (boolean): Only include visible elements
- `window`: Window index or title substring (macOS only)

### `query_ui` (~135 tokens)

Search app UI elements by text, identifier, or label. Works with both simulator and macOS targets.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `maxDepth` (integer): Maximum tree traversal depth
- `query` (string, required): Text to search for
- `role` (string): Filter by AX role (e.g. AXButton, AXStaticText)
- `udid` (string): Simulator UDID (for simulator targets)
- `visibleOnly` (boolean): Only include visible elements

### `tap` (~172 tokens)

Tap coordinates or accessibility element. Selector lookup defaults to in-app content; set all=true to include Simulator chrome UI.

Input parameters:

- `all` (boolean): Include Simulator app chrome/system UI for selector lookup
- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `double` (boolean): Send double-click instead of single click
- `id` (string): Accessibility identifier
- `label` (string): Accessibility label
- `postDelay` (number): Delay after tap in seconds
- `preDelay` (number): Delay before tap in seconds
- `udid` (string): Simulator UDID (for simulator targets)
- `x` (number): X coordinate
- `y` (number): Y coordinate

### `type_text` (~193 tokens)

Type text into the target app. auto resolves to paste for all targets (more reliable for CJK and emoji); simulator paste uses the simulator pasteboard, macOS paste temporarily uses the host clipboard; keyboard types character-by-character.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `file` (string): Path for file input
- `method` (string): Input method: 'auto' = paste for all targets; 'paste' = clipboard; 'keyboard' = char-by-char CGEvent; 'ax' = set value via Accessibility API (most reliable for CJK, bypasses IME)
- `stdinText` (string): Text piped to stdin mode
- `text` (string): Text argument
- `udid` (string): Simulator UDID (for simulator targets)

### `swipe` (~141 tokens)

Perform swipe gesture in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `duration` (number): Duration in seconds
- `endX` (number, required): End X
- `endY` (number, required): End Y
- `postDelay` (number): Delay after swipe in seconds
- `preDelay` (number): Delay before swipe in seconds
- `startX` (number, required): Start X
- `startY` (number, required): Start Y
- `udid` (string): Simulator UDID (for simulator targets)

### `scroll` (~112 tokens)

Send scroll wheel events to the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `deltaX` (number): Horizontal scroll amount
- `deltaY` (number): Vertical scroll amount
- `udid` (string): Simulator UDID (for simulator targets)
- `x` (number): X coordinate for scroll position
- `y` (number): Y coordinate for scroll position

### `drag_drop` (~130 tokens)

Drag and drop in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `duration` (number): Duration in seconds
- `endX` (number, required): End X
- `endY` (number, required): End Y
- `holdDuration` (number): Hold duration before drag in seconds
- `startX` (number, required): Start X
- `startY` (number, required): Start Y
- `udid` (string): Simulator UDID (for simulator targets)

### `tap_tab` (~168 tokens)

Tap a tab in a tab bar by index. Prefers semantic descendants or top-row semantic proxy buttons when available, and falls back to geometry only when needed. Useful for SwiftUI TabView cases where tab buttons are not cleanly exposed.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `index` (integer, required): 0-based tab index to tap
- `postDelay` (number): Delay after tap in seconds
- `preDelay` (number): Delay before tap in seconds
- `tabCount` (integer): Total number of tabs (auto-detected from tab bar children if omitted)
- `udid` (string): Simulator UDID (for simulator targets)

### `wait_for_ui` (~144 tokens)

Wait for a UI element to appear or disappear. Polls query_ui at interval until condition met or timeout.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `condition` (string): Wait condition (default: exists)
- `interval` (number): Poll interval in seconds (default: 0.5)
- `query` (string, required): Text/ID/label to search for
- `timeout` (number): Max wait time in seconds (default: 10)
- `udid` (string): Simulator UDID (for simulator targets)

### `detect_dialog` (~88 tokens)

Detect if a modal dialog, sheet, or alert is currently presented. Returns JSON with hasDialog, type, title, isModal, and buttons.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `udid` (string): Simulator UDID (for simulator targets)

### `set_ui_value` (~125 tokens)

Set value, text selection range, or focus on a UI element via Accessibility API.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `attribute` (string, required): Attribute to set
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `id` (string): Accessibility identifier
- `label` (string): Accessibility label
- `udid` (string): Simulator UDID (for simulator targets)
- `value` (string, required): Value to set (for selectedTextRange use 'location,length' format)

### `read_ui_param` (~128 tokens)

Read parameterized accessibility attributes like text ranges, line numbers, and bounds.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `attribute` (string, required): Parameterized attribute to read
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `id` (string): Accessibility identifier
- `label` (string): Accessibility label
- `param` (string, required): Parameter value (for range types: 'location,length'; for index/line: number)
- `udid` (string): Simulator UDID (for simulator targets)

### `read_ui_value` (~108 tokens)

Read value, selected text, or insertion point of a UI element via Accessibility API.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `attribute` (string): Attribute to read (default: value)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `id` (string): Accessibility identifier
- `label` (string): Accessibility label
- `udid` (string): Simulator UDID (for simulator targets)

### `hit_test` (~58 tokens)

Find which UI element is at specific screen coordinates. Uses system-wide accessibility hit testing. No app target needed.

Input parameters:

- `x` (number, required): Screen X coordinate (top-left origin)
- `y` (number, required): Screen Y coordinate (top-left origin)

### `enumerate_ui` (~98 tokens)

Discover all attributes, actions, and parameterized attributes of a UI element. Shows which attributes are settable.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `id` (string): Accessibility identifier
- `label` (string): Accessibility label
- `udid` (string): Simulator UDID (for simulator targets)

### `button` (~45 tokens)

Press a simulator hardware button.

Input parameters:

- `buttonType` (string, required): Button type
- `duration` (number): Hold duration in seconds
- `udid` (string, required): Simulator UDID

### `key` (~92 tokens)

Press a single HID keycode in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `duration` (number): Hold duration in seconds
- `keycode` (required): HID keycode (0-255)
- `udid` (string): Simulator UDID (for simulator targets)

### `key_sequence` (~91 tokens)

Press multiple HID keycodes in sequence in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `delay` (number): Delay between key presses in seconds
- `keycodes` (required): Key sequence
- `udid` (string): Simulator UDID (for simulator targets)

### `key_combo` (~89 tokens)

Press key combo in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `key` (required): Keycode to press while modifiers are held
- `modifiers` (array, required): Modifier keycodes
- `udid` (string): Simulator UDID (for simulator targets)

### `touch` (~118 tokens)

Perform touch events in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `delay` (number): Delay between down/up in seconds
- `down` (boolean): Send touch down event
- `udid` (string): Simulator UDID (for simulator targets)
- `up` (boolean): Send touch up event
- `x` (number, required): X coordinate
- `y` (number, required): Y coordinate

### `gesture` (~94 tokens)

Execute a preset gesture pattern.

Input parameters:

- `duration` (number): Gesture duration in seconds
- `postDelay` (number): Delay after gesture in seconds
- `preDelay` (number): Delay before gesture in seconds
- `preset` (string, required): Gesture preset
- `screenHeight` (number): Screen height in points
- `screenWidth` (number): Screen width in points
- `udid` (string, required): Simulator UDID

### `input_source` (~85 tokens)

Get current keyboard input source or switch to a specific one. Call without sourceId to query current; with sourceId to switch. Uses CJKV workaround for Korean/Japanese/Chinese/Vietnamese.

Input parameters:

- `sourceId` (string): Input source ID to switch to (e.g. 'com.apple.inputmethod.Korean.2SetKorean'). Omit to query current.

### `list_input_sources` (~25 tokens)

List all available keyboard input sources with their IDs, names, and active status.

### `run_steps` (~139 tokens)

Execute ordered workflow steps using existing tap, type_text, key, swipe, and sleep behavior. Defaults to fail-fast; set continueOnError or continue_on_error to keep going after a failure.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `continueOnError` (boolean): Continue executing later steps after a step fails
- `continue_on_error` (boolean): Alias of continueOnError
- `steps` (array, required): Ordered steps to execute
- `udid` (string): Simulator UDID (for simulator targets)

### `stream_video` (~68 tokens)

Capture a time-bounded simulator clip through the native stream-video shim.

Input parameters:

- `durationSeconds` (number): Requested clip duration in seconds (currently used as a timeout budget)
- `output` (string): Destination MOV file path for the captured clip
- `udid` (string, required): Simulator UDID

### `record_video` (~58 tokens)

Record simulator display directly with simctl recordVideo.

Input parameters:

- `durationSeconds` (number): Requested recording duration in seconds (default: 10)
- `output` (string): Output MOV file path
- `udid` (string, required): Simulator UDID

### `screenshot` (~40 tokens)

Capture a screenshot from simulator display using simctl screenshot.

Input parameters:

- `output` (string): Output PNG file path
- `udid` (string, required): Simulator UDID

### `list_windows` (~65 tokens)

List windows in the target app.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `udid` (string): Simulator UDID (for simulator targets)

### `activate_app` (~65 tokens)

Bring the target app to foreground.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `udid` (string): Simulator UDID (for simulator targets)

### `screenshot_app` (~77 tokens)

Take a screenshot of the target app window.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `output` (string): Output file path
- `udid` (string): Simulator UDID (for simulator targets)

### `right_click` (~116 tokens)

Right-click in the target app. Selector lookup defaults to in-app content; set all=true for Simulator chrome UI.

Input parameters:

- `all` (boolean)
- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `id` (string)
- `label` (string)
- `udid` (string): Simulator UDID (for simulator targets)
- `x` (number)
- `y` (number)

### `menu_action` (~66 tokens)

Execute a menu bar action in a macOS app.

Input parameters:

- `appName` (string)
- `bundleId` (string)
- `item` (string, required): Menu item name (e.g. 'Save')
- `menu` (string, required): Menu name (e.g. 'File')

### `clipboard` (~40 tokens)

Read or write the system clipboard.

Input parameters:

- `action` (string, required): Read or write clipboard
- `text` (string): Text to write (required for write action)

### `focus_window` (~96 tokens)

Raise and focus a specific window by index or title. macOS apps only.

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `index` (integer): Window index (0-based)
- `title` (string): Window title substring
- `udid` (string): Simulator UDID (for simulator targets)

### `context_menu_action` (~112 tokens)

Select an item from an open context menu. Call after right_click. Supports submenu paths with > separator (e.g. 'Refactor > Rename').

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `item` (string, required): Context menu item path (e.g. 'Copy', 'Refactor > Rename')
- `udid` (string): Simulator UDID (for simulator targets)

### `watch_notification` (~164 tokens)

Watch for AX notifications from an app. Blocks until a notification fires or timeout. Use presets for common patterns: window (created/destroyed), text (value/selection changed), focus (app/window focus), menu (opened/closed).

Input parameters:

- `appName` (string): macOS app name (for macOS targets)
- `bundleId` (string): macOS app bundle ID (for macOS targets)
- `notifications` (string): Comma-separated notification names (e.g. 'AXValueChanged,AXWindowCreated')
- `preset` (string): Notification preset (window, text, focus, menu)
- `timeout` (number): Max wait time in seconds (default: 10)
- `udid` (string): Simulator UDID (for simulator targets)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/oozoofrog-baepsae/mcp-baepsae#diagnostics

## Score history

- 2026-08-03: 76
- 2026-08-02: 72
- 2026-08-01: 5
- 2026-07-31: 28
- 2026-07-30: 46
- 2026-07-28: 24
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/mcp-baepsae
- Socket report: https://socket.dev/npm/package/mcp-baepsae
- Repository: https://github.com/oozoofrog/mcp-baepsae
- Changelog RSS feed: https://verifymcp.io/servers/oozoofrog-baepsae/mcp-baepsae/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/oozoofrog-baepsae/mcp-baepsae/changelog.json
- HTML version of this page: https://verifymcp.io/servers/oozoofrog-baepsae/mcp-baepsae
