プロトタイプ · プレビュー版:公式レジストリのすべてのサーバーを掲載し、30分ごとに同期しています。レビューとアカウント機能は今後のステップで始まります。
PopNx MCPAIを使う人のためのMCPサーバー · やさしい言葉で解説

Ios Sim MCP

作者:rmathew1973バージョン 0.4.2i★ –iパソコンで動く
レジストリ名io.github.rmathew1973/ios-sim-mcp

インストール

概要

作者による説明(英語の原文)

Drive the iOS Simulator via semantic accessibility-tree snapshots. Sub-200ms, no WebDriverAgent.

PopNx MCPの3つの柱

この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。

できること

このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。

  • 接続方法: パソコンで動く
  • トランスポート: stdio
  • カテゴリ: 開発者ツール

インストール

使っているAIアプリを選んで、設定をコピーしてください。

インストールの前に

  • 基本チェック:1項目中1項目に合格
  • あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
  • レジストリには、入力が必要なキーは載っていません。

必要なもの

  • npmNode.jsのインストール(npxコマンドに必要)

どのアプリを使っていますか?

上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。

Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます

{
  "mcpServers": {
    "ios-sim": {
      "command": "npx",
      "args": [
        "-y",
        "ios-sim-mcp"
      ]
    }
  }
}

ターミナルでこれを実行します

claude mcp add ios-sim -- npx -y ios-sim-mcp

Cursorで開く

または、設定を自分でコピーする

プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます

{
  "mcpServers": {
    "ios-sim": {
      "command": "npx",
      "args": [
        "-y",
        "ios-sim-mcp"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

VS Codeで開く

または、設定を自分でコピーする

プロジェクトの .vscode/mcp.json に貼り付けます

{
  "servers": {
    "ios-sim": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "ios-sim-mcp"
      ]
    }
  }
}

ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。

これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。

選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。

この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。

できること

パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。

基本チェックi

誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック

  • ✓ 合格

    作者とリポジトリが一致

    レジストリ名は、リポジトリを所有するGitHubアカウント rmathew1973 で確認済みです

  • … 未チェック

    今もメンテナンスされている

    このリポジトリはまだGitHubから読み取っていません

  • … 未チェック

    ライセンスがある

    このリポジトリはまだGitHubから読み取っていません

  • – 対象外

    エンドポイントが応答する

    これはパソコンで動くため、インターネット上のエンドポイントはありません

  • – 対象外

    OAuthでサインイン

    パソコンで動き、代わりにローカルの設定を使います

  • … 未チェック

    ツールの説明に隠れた指示がない

    パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです

開発者ツールのほかのサーバーとの比較i

  • このカテゴリのほかの4906件のうち0%よりスターが多い
  • このカテゴリのほかの4906件のうち15%より最近レジストリに公開
  • 基本チェックの結果が、このカテゴリのほかの4906件のうち100%と同じかそれ以上

レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。

よくある質問

Ios Sim MCPは安全ですか?

当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。

どんなキーやコードが必要ですか?

レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。

パソコンで動きますか、それともクラウドですか?

あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。

今もメンテナンスされていますか?

GitHubリポジトリの最終更新は–、最新バージョン(0.4.2)がレジストリに届いたのは6 か月前です。

どのアプリで使えますか?

Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。

代わりに使えるものは?

同じカテゴリには:GitHub, Desktop Commander, Cloudflare MCP

代わりの候補

同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。

カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i

GitHub

作者:github

Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.

パソコンでもクラウドでも★ 34,245MIT4 日前更新
インストール

Desktop Commander

作者:wonderwhy-er

MCP server for terminal commands, file operations, and process management

パソコンで動く★ 10,225MIT16 日前更新
インストール

作者のREADME

READMEを開く

作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。

ios-sim-mcp

An MCP server that drives the iOS Simulator the way Chrome's DevTools MCP drives a browser: semantic accessibility-tree snapshots with stable element refs, sub-200ms operations, and no screenshot-and-eyeball-coordinates loops.

Built because every existing iOS-simulator automation tool either crawls (Appium, screenshot-based agents) or requires pre-written scripts. This one lets an LLM drive a simulator interactively — find an element by label or ID, tap it by ref, wait for the UI to settle, repeat — at roughly the speed a human would.

Why this exists

Most existing iOS-sim MCPs work by taking a screenshot, asking the model to identify coordinates, then tapping pixels. That's slow (image bytes in context), expensive (vision tokens), and fragile (any layout shift breaks it).

iOS apps already expose a structured accessibility tree — the same one VoiceOver uses. If you query that tree, you get every interactive element with its label, role, AX identifier, frame, and enabled state. You can find what you want semantically, refer to it by a stable ref, and act on it directly. That's what Chrome MCP does for the DOM, and it's what this does for UIView hierarchies in the iOS Simulator.

How it works

Three layers, two shipping today:

LayerStatusTechWhat it gives you
1 — AX tree + actions✅ shippingidb (Facebook's CoreSimulator bridge)snapshot, find, tap, type, swipe, scroll, launch, screenshot — all ~100ms
2a — Dylib proof-of-life✅ shippingDYLD_INSERT_LIBRARIES via SIMCTL_CHILD_*constructor runs in the target app before main(); logs lifecycle via os_log
2b — In-process RPC✅ shippingUnix socket + JSON-Linesround-trip into a running app at ~1ms per call
2c — View introspection✅ shippingMain-thread UIView walkview_tree, view_hit_test — class hierarchy, frames, responder chains, VC annotations
2d — Network interception✅ shippingURLProtocol + URLSessionConfiguration swizzlecapture every HTTP request/response (headers, bodies, timing) inside the app — no cert install, no mitmproxy
2e — JS eval✅ shippingJSContext + JSExport bridgeseval_js({code}) with app / key_window() / defaults / pasteboard / bundle / process / view-finder helpers — Chrome's Runtime.evaluate equivalent
2f — Network stubbing✅ shippingSame URLProtocol, synthesized responseregister canned responses by URL substring + optional method; supports custom status/headers/body + delay_ms for slow-network simulation
3 — System logs✅ shippingxcrun simctl spawn log streamstreaming os_log into a 5000-line ring buffer

idb talks directly to CoreSimulator's private framework — no WebDriverAgent, no HTTP hop into the simulator process — which is why the per-call latency is closer to a local subprocess than to a network round trip.

Requirements

  • macOS with Xcode + iOS Simulator
  • idb (brew tap facebook/fb && brew install idb-companion && pipx install fb-idb)
  • Bun (curl -fsSL https://bun.sh/install | bash)
  • A booted simulator (xcrun simctl boot or open it in Xcode)

Install

Quickest path (npm + npx)
# Register with Claude Code, one line:

claude mcp add -s user ios-sim -- npx -y ios-sim-mcp

npx will fetch the package on first run. Verify:

claude mcp list | grep ios-sim     # ios-sim: ... ✓ Connected

Layer 2 dylib ships prebuilt as a universal binary (arm64 + x86_64) — works on both Apple Silicon and Intel Macs out of the box.

From source
git clone https://github.com/rmathew1973/ios-sim-mcp.git

cd ios-sim-mcp bun install ./dylib/build.sh # builds the Layer 2 dylib (only needed if you'll use inject:true)

Then register:

# Prefer the absolute bun path — clients with a minimal PATH fail on bare `bun`:

claude mcp add -s user ios-sim -- "$HOME/.bun/bin/bun" run "$(pwd)/src/server.ts"

Register with Grok (CLI / Desktop)

Grok MCP spawn PATH is often just /usr/bin:/bin. Bare bun fails with:

Failed to spawn MCP server 'ios-sim': No such file or directory (os error 2)

Use the absolute bun binary in ~/.grok/config.toml:

[mcp_servers.ios-sim]

command = "/Users/YOU/.bun/bin/bun" args = ["run", "/Users/YOU/Projects/ios-sim-mcp/src/server.ts"] enabled = true startup_timeout_sec = 60

Or:

grok mcp add ios-sim -- "$HOME/.bun/bin/bun" run "$HOME/Projects/ios-sim-mcp/src/server.ts"

Restart the Grok session after changing MCP config. Verify: grok mcp list should show ios-sim connected (not failed).

Register with Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{

"mcpServers": { "ios-sim": { "command": "npx", "args": ["-y", "ios-sim-mcp"] } } }

Or, if installed from source, point at the local path:

{

"mcpServers": { "ios-sim": { "command": "/Users/YOU/.bun/bin/bun", "args": ["run", "/absolute/path/to/ios-sim-mcp/src/server.ts"] } } }

Quit and reopen Claude Desktop.

Register with anything else (generic MCP client)

It's a standard stdio MCP server. Run bun run src/server.ts and pipe JSON-RPC. See test/smoke.ts for a working client example.

Tools

ToolWhat it does
list_simulatorsList simulators with UDID, state, OS version
use_simulatorPick a specific UDID (auto-selected if only one is booted)
snapshotCapture the AX tree, assign refs e1..eN, return compact text rendering. Filters: interactive (default), actionable, all
findSearch the snapshot by id (AXUniqueId), label, labelContains, role, actionable
tapTap by {ref}, {id}, or {x,y}. Optional duration makes it a long-press
type_textType into the focused field. Optional {ref} or {id} taps-then-types. Auto-routes through paste when the dylib is loaded for byte-perfect input — no iOS autocorrect, no first-letter capitalization. via: "keystroke" forces the typing path; via: "paste" forces the paste path
paste_textByte-perfect text via UIPasteboard + first-responder paste:. Requires the dylib injected. The right answer for emails, passwords, OAuth tokens, anything case-sensitive
view_treeWalk the running app's UIView hierarchy on the main thread. Reports class names, frames in window coords, alpha/hidden/interactive, text content, and annotates view-controller boundaries. Strictly richer than snapshot — sees custom-drawn views, transient overlays, SwiftUI internals. Filter by class_filter / ax_id_contains / text_contains. Requires dylib injected
view_hit_test"What view actually receives a tap at (x,y)?" Returns the topmost view plus the full responder chain up to UIApplication. The right debugging tool when a tap isn't doing what you expect. Requires dylib injected
network_start / network_stop / network_statusInstall/remove an URLProtocol interceptor + swizzle URLSessionConfiguration so every URLSession-based HTTP request flowing through the app is recorded. Options: max_records, max_body_bytes, filter_url_substring. Requires dylib injected
network_tailReturn the most recent N captured records. Default: one line per request (id, method, status, timing, sizes, URL). full=true includes headers + body previews inline. Page forward via since_id
network_get_bodyFetch the full request or response body (up to max_body_bytes, default 256KB) for a specific record id. Returns base64 + UTF-8 decode for text bodies
network_clearDrop the ring buffer and all retained bodies
network_self_testFire an HTTP request from inside the app to verify the capture path end-to-end
network_stub / network_stubs / network_unstub / network_unstub_allRegister canned HTTP responses by URL substring (+ optional method). Synthesizes status/headers/body without forwarding; delay_ms simulates slow networks. Stubbed requests still appear in network_tail with stubbed:true
eval_jsRun arbitrary JavaScript in a persistent JSContext inside the injected app. Bridged globals: app, key_window(), all_windows(), defaults, pasteboard, bundle, process, notif_center, first_responder(), find_view_by_ax_id, find_view_by_class, find_vc_by_class, post_notification, cls, log. State persists across calls. Requires dylib injected
eval_js_resetDrop the JSContext and rebuild bridges on next eval — forgets your defined vars/fns
keyPress a key by name (RETURN, ESC, DELETE, TAB, SPACE, F1–F12, arrows) or raw HID code
buttonHardware button: HOME, LOCK, SIDE_BUTTON, SIRI, APPLE_PAY
swipeSwipe between two refs/ids/points. Optional duration and delta
scrollReader-perspective scroll: down reveals content below. Optional anchor element
launch_appLaunch by bundle id. Optional foreground_if_running terminates first
terminate_appTerminate by bundle id
screenshotPNG to disk or inline. Use sparingly — the AX tree is faster and richer
await_quiescentBlock until the AX-tree hash is identical for stable_ms (default 250) or timeout_ms (default 5000). Use after launches and navigation instead of sleep
log_start / log_tail / log_stop / log_clearStream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate

Example session

> snapshot

Settings screen=402x874 v=5 elements=15

e3 Button "Apple Account" #com.apple.settings.primaryAppleAccount @(201,213) e5 Button "General" #com.apple.settings.general @(201,406) e6 Button "Accessibility" #com.apple.settings.accessibility @(201,458) e14 TextField "Search" ="Search" @(201,822) ...

tap {id: "com.apple.settings.general"}

tapped e5/com.apple.settings.general

await_quiescent {stable_ms: 250}

stable hash=8326196f25c8 samples=4 elapsed=1731ms

snapshot

Settings v=10 elements=13

e2 Button "Settings" #BackButton @(38,84) e6 Button "About" #About @(201,418) ...

type_text {ref: "e14", text: "wifi"}

typed 4 chars into e14

Measured on iPhone 17 Pro / iOS 26.5 / M-series Mac:

  • snapshot: 127–190 ms
  • tap: 100 ms
  • find: <1 ms (in-memory against cached snapshot)
  • await_quiescent: 400 ms – 2.5 s (real UI settle time)

Design notes

  • Snapshots are versioned and cached. Any action (tap, swipe, type_text, launch_app, button, key) invalidates the cache so stale refs can't survive a state change. find and ref resolution will tell you to re-snapshot rather than acting on old data.
  • Refs are stable within a snapshot, not across snapshots. e5 in v=10 is not the same element as e5 in v=11. AXUniqueIds (the iOS accessibilityIdentifier) are stable across snapshots and are the preferred way to target a control across UI changes.
  • `await_quiescent` ignores degenerate AX trees. For ~1s after launch_app, idb returns just the AXApplication root with no children. A naive hash-stability check would return instantly with an empty tree. The implementation resets the stability timer whenever it sees a degenerate snapshot.
  • `scroll` is reader-perspective. down means "see what's below" (finger drags up), matching mouse-wheel/page-down conventions, not finger-direction. Default 0.4s gesture duration prevents iOS from interpreting the release point as a tap on the underlying element.

Tip: add accessibility identifiers to your own apps

This MCP is fastest and most reliable when interactive controls have accessibilityIdentifier set:

Button("Sign In") { ... }

.accessibilityIdentifier("login_submit_button")

Then tap({id: "login_submit_button"})

冒頭だけを表示しています。続きはリポジトリで読めます

PopNxに聞く