freshcrate
Skin:/
Home > MCP Servers > mirroir-mcp

mirroir-mcp

MCP server for controlling a real iPhone via macOS iPhone Mirroring...and any MacOs app. Screenshot, tap, swipe, type — from any MCP client.

Why this rank:Strong adoptionRecent releaseHealthy release cadence

Description

MCP server for controlling a real iPhone via macOS iPhone Mirroring...and any MacOs app. Screenshot, tap, swipe, type — from any MCP client.

README

mirroir-mcp

mirroir-mcp

npm version Build Install Installers MCP Compliance License macOS 15+ Discord

Give your AI eyes, hands, and a real iPhone. An MCP server that lets any AI agent see the screen, tap what it needs, and figure the rest out — through macOS iPhone Mirroring. Experimental support for macOS windows. 32 tools, any MCP client.

Requirements

Install

/bin/bash -c "$(curl -fsSL https://mirroir.dev/get-mirroir.sh)"

or via npx:

npx -y mirroir-mcp install

or via Homebrew:

brew tap jfarcand/tap && brew install mirroir-mcp

The first time you take a screenshot, macOS will prompt for Screen Recording and Accessibility permissions. Grant both.

Per-client setup

Claude Code

claude mcp add --transport stdio mirroir -- npx -y mirroir-mcp

GitHub Copilot (VS Code)

Install from the MCP server gallery: search @mcp mirroir in the Extensions view, or add to .vscode/mcp.json:

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

Cursor

Add to .cursor/mcp.json in your project root:

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

OpenAI Codex

codex mcp add mirroir -- npx -y mirroir-mcp

Or add to ~/.codex/config.toml:

[mcp_servers.mirroir]
command = "npx"
args = ["-y", "mirroir-mcp"]
Install from source
git clone https://github.com/jfarcand/mirroir-mcp.git
cd mirroir-mcp
./mirroir.sh

Use the full path to the binary in your .mcp.json: <repo>/.build/release/mirroir-mcp.

How it works

Every interaction follows the same loop: observe, reason, act. describe_screen gives the AI every text element with tap coordinates (eyes). The LLM decides what to do next (brain). tap, type_text, swipe execute the action (hands) — then it loops back to observe. No scripts, no coordinates, just intent.

Describe Your App

mirroir can explore any iOS app blindly — but it works best when you tell it what to expect. Write an APP.md file and mirroir gets a map before it starts:

---
app: Santé
archetype: dashboard
obstacle_mode: auto
---

## Structure
Dashboard with 4 tabs: Résumé, Partage, Parcourir, Profil.

## Résumé Tab
- Summary cards for health metrics that drill down to charts
- Cards often show "Aucune donnée" on test devices

## Obstacles
- Health Access permission → tap "Autoriser"
- Notification permission → tap "Ne pas autoriser"

## Skip
- Supprimer les données de Santé
- Réinitialiser

30 seconds of writing saves minutes of blind exploration. The archetype tells mirroir how the app navigates (dashboard = card drill-down, social-feed = infinite scroll, settings-list = chevron rows). Obstacles are auto-dismissed. Skip elements are never tapped. Structure and tab descriptions become AI context in generated skills.

Three levels of patterns work together — elements (what rows look like), screens (what the page layout means), and apps (what the developer knows). See Patterns & Skills for the full system.

Examples

Paste any of these into Claude Code, Claude Desktop, ChatGPT, Cursor, or any MCP client:

Open Messages, find my conversation with Alice, and send "running 10 min late".
Open Calendar, create a new event called "Dentist" next Tuesday at 2pm.
Open my Expo Go app, tap "LoginDemo", test the login screen with
test@example.com / password123. Screenshot after each step.
Start recording, open Settings, scroll to General > About, stop recording.

Screen Intelligence

describe_screen is the AI's eyes. Three backends work together to give the agent a complete picture of what's on screen — text, icons, and semantic UI structure.

Apple Vision OCR (default)

The default backend uses Apple's Vision framework to detect every text element on screen and return exact tap coordinates. This is fast, local, and requires no API keys or external services.

Icon Detection (YOLO CoreML)

Text-only OCR misses non-text UI elements — buttons, toggles, tab bar icons, activity rings. Drop a YOLO CoreML model (.mlmodelc) in ~/.mirroir-mcp/models/ and the server auto-detects it at startup, merging icon detection results with OCR text. The AI gets tap targets for elements that text-only OCR cannot see.

Mode ocrBackend setting Behavior
Auto-detect (default) "auto" Uses Vision + YOLO if a model is installed, Vision only otherwise
Vision only "vision" Apple Vision OCR text only
YOLO only "yolo" CoreML element detection only
Both "both" Always merge both backends (falls back to Vision if no model)

AI Vision Mode (embacle)

Instead of local OCR, describe_screen can send the screenshot to an AI vision model that identifies UI elements semantically — cards, tabs, buttons, icons, navigation structure — not just raw text. This produces richer context for the agent, especially on screens with complex layouts.

The embacle runtime is embedded directly into the mirroir-mcp binary via Rust FFI. describe_screen calls the embedded runtime in-process — no separate server, no network round-trip, no additional setup. The FFI layer (EmbacleFFI.swiftlibembacle.a) handles initialization, chat completion requests, and memory management across the Swift/Rust boundary.

embacle routes vision requests through already-authenticated CLI tools (GitHub Copilot, Claude Code) so there is no separate API key to manage. If you have a Copilot or Claude Code subscription, you already have access.

Install

brew tap dravr-ai/tap
brew install embacle          # CLI tools (embacle-server, embacle-mcp)
brew install embacle-ffi      # Rust FFI static library (libembacle.a)

Then rebuild mirroir-mcp from source (or reinstall via Homebrew) so the binary links against libembacle.a:

# From source
swift build -c release

# Or via Homebrew (rebuilds automatically)
brew reinstall mirroir-mcp

Zero-config activation

When the embacle FFI is linked into the binary, screenDescriberMode defaults to "auto" which automatically resolves to vision mode. No settings change required — install embacle-ffi, rebuild, and describe_screen starts using AI vision.

To force local OCR even when embacle is available, explicitly set "ocr":

// .mirroir-mcp/settings.json
{
  "screenDescriberMode": "ocr"
}

See Configuration for all available settings.

Skills

When you find yourself repeating the same agent workflow, capture it as a skill. Skills are SKILL.md files — numbered steps the AI follows, adapting to layout changes and unexpected dialogs. Steps like Tap "Email" use OCR — no hardcoded coordinates.

Place files in ~/.mirroir-mcp/skills/ (global) or <cwd>/.mirroir-mcp/skills/ (project-local).

APP.md

Describe your app's structure to guide exploration — see Describe Your App above. Place APP.md files in ~/.mirroir-mcp/skills/ or the mirroir-skills repo at patterns/apps/.

---
version: 1
name: Commute ETA Notification
app: Waze, Messages
tags: ["workflow", "cross-app"]
---

## Steps

1. Launch **Waze**
2. Wait for "Où va-t-on ?" to appear
3. Tap "Où va-t-on ?"
4. Wait for "${DESTINATION:-Travail}" to appear
5. Tap "${DESTINATION:-Travail}"
6. Wait for "Y aller" to appear
7. Tap "Y aller"
8. Wait for "min" to appear
9. Remember: Read the commute time and ETA.
10. Press Home
11. Launch **Messages**
12. Tap "New Message"
13. Type "${RECIPIENT}" and select the contact
14. Type "On my way! ETA {eta}"
15. Press **Return**
16. Screenshot: "message_sent"

${VAR} placeholders resolve from environment variables. ${VAR:-default} for fallbacks.

Skill Marketplace

Install ready-to-use skills from jfarcand/mirroir-skills:

git clone https://github.com/jfarcand/mirroir-skills ~/.mirroir-mcp/skills

From Exploration to CI

The generate_skill tool lets an AI agent explore an app and produce SKILL.md files. It uses breadth-first search (BFS) to traverse the app as a navigation graph — screens are nodes, tappable elements are edges. The explorer describes each screen, matches elements against component definitions to decide what to tap, visits child screens, and backtracks via the back chevron. Duplicate screens are skipped via structural fingerprinting. See Component Detection below for how the explorer interprets raw elements into structured UI components.

The explorer works viewport-by-viewport: after calibrating the page length, it builds a plan from the current viewport, taps elements top-to-bottom, scrolls down to reveal more content, and rebuilds the plan for each new viewport. This approach works with both OCR and AI vision describers. Pass seed for deterministic ordering across runs.

Exploration is bounded — it does not discover every reachable screen in large apps. Depth, screen count, and time limits keep runs practical. For targeted flows, provide a goal to focus the traversal.

graph TD
    A["Launch App"] --> B["Describe Screen"]
    B --> C{"Calibrated?"}
    C -- No --> D["Scroll Full Page"]
    D --> E{"skip_calibration?"}
    E -- No --> F["Component Detect +\nClassify + Validate"]
    E -- Yes --> G["Classify Elements\nDirectly"]
    F --> H["Build Plan"]
    G --> H
    C -- Yes --> H

    H --> I{"Untried\nElements?"}
    I -- Yes --> J["Tap Element"]
    I -- No --> K["Return to Root"]

    J --> M["Describe +\nClassify Edge"]
    M --> N{"Transition"}
    N -- new screen --> O["Add to Frontier"]
    O --> P["Backtrack"]
    N -- revisited/dead --> P

    P -- push: tap back --> H
    P -- modal: tap close --> H
    P -- tab: tap prev --> H

    K --> Q{"Frontier\nEmpty?"}
    Q -- No --> R["Next Frontier\nScreen"]
    R --> B
    Q -- Yes --> S["Generate SKILL.md"]
Loading

Generate

Two modes: autonomous exploration (BFS) and guided session (manual step-by-step).

Autonomous BFS exploration — the agent explores on its own:

Explore the Settings app and generate a skill that checks the iOS version.

This calls generate_skill(action: "explore", app_name: "Settings", goal: "check iOS version") under the hood. The explorer launches the app, runs BFS from the root screen, and outputs a SKILL.md for the discovered path.

Parameter Default Description
app_name required App to explore
goal none Focus exploration toward a specific flow (e.g. "check software version")
goals none Array of goals — one SKILL.md per goal
max_depth 6 Maximum BFS depth
max_screens 30 Maximum screens to visit
max_time 300 Maximum seconds before stopping
strategy auto "mobile" (default), "social" (Reddit, Instagram), or "desktop" (macOS windows)
skip_calibration false Skip component detection during calibration. Scrolling still runs. Useful with AI vision describers that produce clean semantic elements
seed random Integer seed for deterministic exploration ordering. Same seed produces identical tap sequences
fresh true Discard persisted navigation graph and explore from scratch. Set false for incremental exploration

Guided session — the AI navigates manually, capturing each screen:

  1. generate_skill(action: "start", app_name: "MyApp") — launch app, OCR first screen
  2. Use tap/swipe/type_text to navigate, then generate_skill(action: "capture") to record each screen
  3. generate_skill(action: "finish") — assemble captured screens into a SKILL.md

Test

Run skills deterministically from the CLI — no AI in the loop:

mirroir test apps/settings/check-about
mirroir test --junit results.xml --verbose        # JUnit output
mirroir test --dry-run apps/settings/check-about    # validate without executing
Option Description
--junit <path> Write JUnit XML report
--screenshot-dir <dir> Save failure screenshots (default: ./mirroir-test-results/)
--timeout <seconds> wait_for timeout (default: 15)
--verbose Step-by-step detail
--dry-run Parse and validate without executing
--no-compiled Skip compiled skills, force full OCR

Exit code 0 = all pass, 1 = any failure.

Compiled Skills

Compile a skill once to capture coordinates and timing. Replay with zero OCR — a 10-step skill drops from 5+ seconds of OCR to under a second.

mirroir compile apps/settings/check-about        # compile
mirroir test apps/settings/check-about            # auto-detects .compiled.json
mirroir test --no-compiled check-about            # force full OCR

AI agents auto-compile skills as a side-effect of the first MCP run. See Compiled Skills for details.

AI-Assisted Diagnosis

When a test step fails, pass --agent to get an AI diagnosis of what went wrong and suggested fixes:

mirroir test --agent gpt-5.3 apps/settings/check-about
mirroir test --agent claude-sonnet-4-6 apps/settings/check-about
mirroir test --agent ollama:llama3 apps/settings/check-about
mirroir test --agent embacle apps/settings/check-about

Built-in agents:

Agent Provider API Key
gpt-5.3 OpenAI OPENAI_API_KEY
claude-sonnet-4-6, claude-haiku-4-5 Anthropic ANTHROPIC_API_KEY
ollama:<model> Ollama (local) None
embacle, embacle:claude embacle-server CLI agent key

Custom agents can be defined as YAML profiles in ~/.mirroir-mcp/agents/.

No API key? Use embacle

embacle routes requests through already-authenticated CLI tools (GitHub Copilot, Claude Code, etc.) — no separate API key needed:

brew tap dravr-ai/tap && brew install embacle
mirroir test --agent embacle my-skill

Pattern System

The explorer uses a three-layer pattern system to understand iOS apps — the same declarative concept at different scales:

  • Element patterns (patterns/elements/) — 34 definitions matching row-level UI components (table rows, tab bars, toggles, summary cards). Each specifies match rules, interaction behavior, and grouping logic.
  • Screen patterns (patterns/screens/) — 7 archetype recipes that identify screen-level navigation models from element composition. Auto-detected during calibration, or declared via archetype in APP.md.
  • App patterns (patterns/apps/) — APP.md files with structure, obstacles, skip lists, and archetype declarations. The developer's source of truth.

Built-in archetypes: settings-list, dashboard, social-feed, content-grid, conversation-list, utility-display, detail-form.

Place custom patterns in ~/.mirroir-mcp/components/ (elements), ~/.mirroir-mcp/recipes/ (screens), or the mirroir-skills repo.

Vision Indicators

AI vision describers describe UI elements semantically ("Activité chevron") rather than character-by-character ("Activité" + ">"). A vision-indicators.md file maps these descriptions to OCR-compatible characters so the component pipeline works identically with both backends:

## Indicators
- chevron: >
- dismiss: ×
- back: <

When a vision element ends with a mapped suffix (e.g. "Entraînements chevron"), the normalizer splits it into two elements: "Entraînements" + ">". Place vision-indicators.md alongside your component definitions.

See Component Detection for the full definition format, match rule reference, and the detection pipeline.

Security

Giving an AI access to your phone demands defense in depth. mirroir-mcp is fail-closed at every layer.

  • Tool permissions — Without a config file, only read-only tools (screenshot, describe_screen) are exposed. Mutating tools are hidden from the MCP client entirely — it never sees them.
  • App blockingblockedApps in permissions.json prevents the AI from interacting with sensitive apps like Wallet or Banking, even if mutating tools are allowed.
  • No root required — Runs as a regular user process using the macOS CGEvent API. No daemons, no kernel extensions, no root privileges — just Accessibility permissions.
  • Kill switch — Close iPhone Mirroring to kill all input instantly.
// ~/.mirroir-mcp/permissions.json
{
  "allow": ["tap", "swipe", "type_text", "press_key", "launch_app"],
  "deny": [],
  "blockedApps": ["Wallet", "Banking"]
}

See Permissions and Security for the full threat model.

CLI Tools

Recorder

Record interactions as a skill file:

mirroir record -o login-flow.yaml -n "Login Flow" --app "MyApp"

Doctor

Verify your setup:

mirroir doctor
mirroir doctor --json    # machine-readable output

Configure

Set up your keyboard layout for non-US keyboards:

mirroir configure

Updating

# curl installer
/bin/bash -c "$(curl -fsSL https://mirroir.dev/get-mirroir.sh)"

# npx
npx -y mirroir-mcp install

# Homebrew
brew upgrade mirroir-mcp

# From source
git pull && swift build -c release

Uninstall

# Homebrew
brew uninstall mirroir-mcp

# From source
./uninstall-mirroir.sh

Configuration

All settings live in settings.json — project-local (.mirroir-mcp/settings.json) or global (~/.mirroir-mcp/settings.json). Project-local settings override global ones. Every setting also has a corresponding environment variable (e.g. MIRROIR_SCREEN_DESCRIBER_MODE).

{
  "screenDescriberMode": "auto",
  "agent": "embacle",
  "ocrBackend": "auto",
  "keystrokeDelayUs": 15000,
  "explorationMaxScreens": 30
}

See Configuration Reference for all 40+ settings covering screen intelligence, input timing, scroll behavior, exploration budgets, AI providers, and keyboard layouts.

Documentation

Tools Reference All 32 tools, parameters, and input workflows
Configuration All settings: screen intelligence, input timing, exploration, AI providers
FAQ Security, focus stealing, keyboard layouts, embacle/vision mode
Security Threat model, kill switch, and recommendations
Permissions Fail-closed permission model and config file
Known Limitations Focus stealing, keyboard layout gaps, autocorrect
Patterns & Skills Element patterns, screen recipes, APP.md app descriptions, and the detection pipeline
YOLO Icon Detection Recommended YOLO models, CoreML setup, and configuration
Compiled Skills Zero-OCR skill replay
Testing FakeMirroring, integration tests, and CI strategy
Troubleshooting Debug mode and common issues
Contributing How to add tools, commands, and tests
Skills Marketplace Skill format, plugin discovery, and authoring

Community

Join the Discord server to ask questions, share skills, and discuss ideas.

Contributing

Contributions welcome. By submitting a patch, you agree to the Contributor License Agreement — your Git commit metadata serves as your electronic signature.


Why "mirroir"? — It's the old French spelling of miroir (mirror). A nod to the author's roots, not a typo.

Release History

VersionChangesUrgencyDate
runner-v0.1.2**Full Changelog**: https://github.com/jfarcand/mirroir-mcp/compare/runner-v0.1.1...runner-v0.1.2High6/4/2026
v0.33.3## What's Changed ### Features - **mcp:** add press_back tool and capture-latency metric to check_health - **runner:** scaffold mirroir-run Rust binary — CLI surface only - **simulator:** FakeMirroring multi-app simulator runtime Replaces the hardcoded FakeScenario enum with an APP.md-driven AppPack/AppRegistry stack that hosts every loaded app in one binary, dispatches via Spotlight + App Switcher overlays, and renders scenes through SceneRenderer. - **simulator:** add SimulatorSpec schema andHigh5/29/2026
v0.33.2## What's Changed ### Bug Fixes - **tap:** require uniform spacing before applying icon-label upward offset Rows with 3+ short labels but uneven X spacing (e.g. Chrome download bar with X / DOWNLOAD / · 1.9 MB) used to be flagged as icon grids and shifted ~30pt upward, missing the button. Gate the offset on max/min spacing ratio ≤ 1.5. Fixes #24. ### Chores - bump version to 0.33.2 **Full Changelog**: https://github.com/jfarcand/mirroir-mcp/compare/v0.33.1...v0.33.2 High4/30/2026
v0.33.0## What's Changed ### Features - **app-md:** formal spec + orientation-aware layout + permission bridge New docs/APP.md.spec.md documents every parser field. ## Tab Layout adds vertical edge-control support; IconDetector extrapolates on the dominant axis. Credentials render keys-only in skills; hints get a distinct ## Tips section. permissions.json gains perApp tool allow/deny. - **targets:** orientation-aware layout zones for iPhone Mirroring IPhoneMirroringTarget now publishes per-orientationHigh4/23/2026
v0.32.2## What's Changed ### Features - **app-desc:** add reset_before_explore flag for clean app launch Force-quits via App Switcher before launch when APP.md declares it. - **explore:** tab-driven navigation from APP.md for non-standard UIs Parse tab names from Structure section, inject as priority targets when components fail. ### Bug Fixes - **explore:** always inject APP.md tabs as priority targets, not just on empty plan ### Chores - bump version to 0.32.2 - clean orphaned files and update gitHigh4/15/2026
v0.32.1## What's Changed ### Features - **patterns:** unify vocabulary, add archetype field, update search paths patterns/elements, patterns/screens, patterns/apps with legacy fallback paths. ### Bug Fixes - **tests:** resolve skill paths under both skills/ and legacy root Handles new patterns/ and skills/ structure, skips APP.md + patterns/ files. - **tests:** skip APP.md loader integration test when sibling repo absent Uses XCTSkipUnless to gracefully handle CI environments without the skills repo.High4/10/2026
v0.32.0## What's Changed ### Features - **design-system:** iOS design system with recipes, APP.md descriptions, and 13 new components Screen recipes for archetype detection, APP.md for human-authored app maps with obstacle auto-dismiss. - **ocr:** add configurable recognition languages via MIRROIR_OCR_LANGUAGES Adds readStringArray helper, ocrLanguages property, and unit tests. Fixes #19. - **screen:** add omit_screenshot option for describe_screen MIRROIR_OMIT_SCREENSHOT env var + per-call param, fixMedium4/9/2026
v0.31.1## What's Changed ### Bug Fixes - **deps:** update website dependencies to resolve security alerts - **tap:** apply iconOffset to bottom zone icon rows, fixes #15 ### Chores - bump version to 0.31.1 **Full Changelog**: https://github.com/jfarcand/mirroir-mcp/compare/v0.31.0...v0.31.1 Medium3/31/2026
v0.31.0## What's Changed ### Features - **ocr|vision:** upscale small screenshots for OCR, add visionModel override - **vision:** zoom-mode calibration, parser hardening, border cropping ### Chores - bump version to 0.31.0 - **deps:** bump h3 **Full Changelog**: https://github.com/jfarcand/mirroir-mcp/compare/v0.30.1...v0.31.0 Medium3/31/2026
v0.30.1## OCR Coordinate Fix - **Y-coordinate mapping fixed** — Vision OCR now maps through actual image height (in points) instead of the AX-reported window height. When screencapture includes extra chrome beyond the window bounds (rounded corners, home indicator), bottom-of-screen elements were compressed upward by ~10%. Fixes #11. - **False border detection eliminated** — ContentBoundsDetector threshold raised from 1px to 5% per axis. The phone's rounded corners trimmed a few pixels, falsely triggeMedium3/30/2026
v0.30.0## Breaking Changes - **Plan ordering locked to Y-first** — Exploration plans sort by screen position (top-to-bottom), with score as tiebreak for same-Y elements. Q-value boosts still differentiate via score. This is the deliberate, predictable ordering for per-viewport exploration. - **API rename: `elementText` → `displayLabel`** — `updateQValue`, `markEdgeDead`, `isEdgeDead`, `qValue` parameters renamed from `elementText` to `displayLabel` to match actual semantics. Callers that use these APIMedium3/26/2026
v0.29.2## Exploration Quality - **Score-first plan ordering** — Plans now sort by priority score (role + chevron + Q-value), with Y-position as tiebreak. Previously Y-first ordering neutralized learned Q-values and component priority. - **Q-learning key normalization** — Q-value updates and dead-edge marks now use `displayLabel` (clean component name) consistently, matching how the BFS explorer keys its lookups. Previously keyed on raw `elementText` which diverged from `displayLabel` on component-normMedium3/25/2026
v0.29.1## Bug Fixes - **Fix embacle-ffi linking on Homebrew installs** — `swift build` now searches Homebrew's library paths (`/opt/homebrew/opt/embacle-ffi/lib` on Apple Silicon, `/usr/local/opt/embacle-ffi/lib` on Intel) for `libembacle.a`. Previously, users had to manually symlink the library to `/usr/local/lib`. Fixes #8. ## Documentation - **YOLO icon detection guide** — New [docs/yolo-models.md](docs/yolo-models.md) with recommended models (OmniParser v2.0), CoreML conversion steps, and configMedium3/25/2026
v0.29.0## What's New ### Vision-Aware Exploration - **Vision indicator normalization**: Maps vision model descriptions (e.g. "chevron") to OCR-compatible characters (">") via `vision-indicators.md` skill files - **Per-viewport exploration**: Build and execute plans one viewport at a time instead of requiring a full-page plan upfront - **Skip calibration mode** (`skip_calibration: true`): Works reliably with vision describers that produce clean semantic elements ### Exploration Reliability - **3rd bacMedium3/22/2026
v0.28.0## What's Changed ### Features - add skip_calibration parameter to generate_skill explore - exploration v3 — persistent graph, smart scrolling, edge classification, coverage plateau, CEGAR state abstraction, reproducible PRNG ### Bug Fixes - **ci:** generate bullet-point release notes from conventional commits ### Documentation - merge component detection into exploration section ### Chores - bump version to 0.28.0 - remove unused swift-format and swiftlint configs **Full Changelog**: httpsLow3/17/2026
v0.27.0## What's Changed ### Features - auto-detect embacle FFI for vision mode default - embedded embacle via Rust FFI - AI vision screen describer using embacle ### Bug Fixes - **ci:** pass embacle-ffi lib path to Homebrew formula build - **ci:** use embacle-ffi formula for FFI static library - **ci:** symlink embacle to /usr/local/lib for SPM linker - **test:** adjust YOLO icon Y coordinate above status bar cutoff - **test:** disambiguate modal-sheet tests from article-modal overlap - **componentsLow3/13/2026
v0.26.0## What's Changed ### Features - **bfs:** post-backtrack verification with modal recovery - **exploration|scroll:** calibration pipeline with scroll-aware OCR - **exploration|input:** displayLabel wiring, swipe focus fix, hot-reload safety - **components:** add exploration policy, label rules, and split mode - **input:** add cursor-free mode and harden FakeMirroring event handling ### Bug Fixes - **test|bfs:** align BFS test mocks with backtrack verification OCR, conditional re-OCR after calibLow3/12/2026
v0.25.0## What's Changed ### Features - **FakeMirroring:** full input pipeline — scroll, type, long press, drag, double tap - **tests:** E2E component calibrate → compile → replay integration test - **eval:** evaluation framework fixes, interactive FakeMirroring - **compiled:** compiled assertions, staleness detection, multi-scenario FakeMirroring ### Bug Fixes - **test:** update open_url test for target-type gating - **interaction:** target-aware navigation hints, gate keyboard commands for mobile -Low3/7/2026
v0.24.0## What's Changed ### Features - **explore|scroll:** add nav bar identity, edge classification, anchor-based scroll dedup, full-page describe_screen, and frontier backtrack - add EmbacleProvider for key-free AI agent diagnosis ### Bug Fixes - **input:** adjust statusBarTapY to 30pt inside iOS content area - **input:** click status bar to engage key window after Space switch - **input:** prime scroll handler with MayBegin phase after focus switch - **input:** add momentum phase end to trackpad Low3/4/2026
v0.23.0## What's Changed ### Features - **ocr:** add YOLO CoreML element detection with auto-detect - **ocr:** extract TextRecognizing protocol for pluggable OCR backends - **scroll:** add fuzzy deduplication strategies for CalibrationScroller ### Documentation - **readme:** trim What's Changed, add Component Detection, remove Agent Diagnosis ### CI - fix Swift Testing hang in release workflow - run Swift Testing serially on CI to prevent executor deadlock - split XCTest and Swift Testing into separLow2/28/2026
v0.22.2## What's Changed ### Features - **hot-reload:** debug-only auto-reload, --restart-on-crash for release - **calibration:** add chevron_mode, detection view, and scroll-through ### Bug Fixes - **hot-reload:** restore --hot-reload-enabled opt-in flag - **hot-reload:** make binary-replacement reload always active - **hot-reload:** disable auto-reload by default, opt-in via --hot-reload-enabled - **debug:** preserve log across restarts when --debug is active - **input|calibration|debug:** trackpadLow2/27/2026
v0.22.1## What's Changed ### Features - **ci:** switch npm publish to OIDC Trusted Publisher No token or OTP needed — uses GitHub OIDC provenance like atmosphere - hot-reload server via execv, component absorption, git version logging Post-process absorption for component detection, auto-reload on binary change, startup version logging - **components:** add precision match rules, rename calibrate_component Add min_confidence/exclude_numeric_only/text_pattern rules, built-in skip patterns, non-clickablLow2/27/2026
v0.21.0## What's Changed ### Features - **explorer:** scout phase, screen planner, localized reset_app Add ElementClassifier, ScoutPhase, ScreenPlanner for smarter DFS exploration; fix reset_app for localized iPhones via launch-first approach. - improve multi-skill output with manifest, landmark naming, and depth-capped leaves SkillManifestGenerator, LandmarkPicker-based path names, depth-capped leaf detection - add tab bar fast-backtrack to DFS explorer Skip multiple levels to root in one step for taLow2/24/2026
v0.20.0Release v0.20.0Low2/23/2026
v0.19.0## What's Changed - **No more Karabiner or root privileges** — All input (tap, swipe, type, press_key, shake) now uses macOS CGEvent API directly. No helper daemon, no DriverKit extension, no sudo. Just grant Accessibility + Screen Recording permissions. - **Autonomous app explorer** — `generate_skill` with `action: "explore"` does DFS exploration of any app, producing SKILL.md files automatically. - **Icon detection** — `describe_screen` detects unlabeled tab bar and toolbar icons via pixel clLow2/23/2026
v0.18.0Release v0.18.0Low2/22/2026
v0.17.0Release v0.17.0Low2/22/2026
v0.16.0Release v0.16.0Low2/22/2026
v0.15.1Release v0.15.1Low2/21/2026
v0.15.0## What's New - **Renamed to mirroir-mcp** — all binaries, config paths, and env vars updated from `iphone-mirroir-*` to `mirroir-*` - **Multi-target window automation** — drive any macOS window (Spotify, Figma, Terminal) alongside iPhone Mirroring with `list_targets` and `switch_target` - **Uninstall now cleans up completely** — MCP binary, helper daemon, and pre-rename artifacts all removed ## Breaking Changes - Config directory: `~/.iphone-mirroir-mcp/` → `~/.mirroir-mcp/` - Environment vaLow2/20/2026
v0.14.1Release v0.14.1Low2/20/2026
v0.14.0## Highlights **Standalone DriverKit** — New installs no longer require full Karabiner-Elements. The installer downloads the [standalone Karabiner DriverKit package](https://github.com/pqrs-org/Karabiner-DriverKit-VirtualHIDDevice) (v6.10.0) which provides only the virtual HID device — no keyboard grabber, no modifier state corruption. Existing Karabiner-Elements installs are detected and reused automatically. **Agent Diagnosis** — When compiled scenarios fail, `--agent` diagnoses *why*. DeterLow2/20/2026
v0.13.0## What's New ### New Tools - **`scroll_to`** — Scroll until a text element becomes visible via OCR - **`reset_app`** — Force-quit an app via App Switcher - **`measure`** — Time a screen transition (action → visual change) - **`set_network`** — Toggle airplane/Wi-Fi/cellular via Settings - **`start_recording` / `stop_recording`** — Record video of the mirrored screen ### New CLI - **`mirroir`** CLI wrapper for all MCP tools - **`mirroir test`** — Deterministic scenario execution with JUnit outLow2/18/2026
v0.12.3Rename MCP server name from `iphone-mirroring` to `mirroir` across all config examples and install paths.Low2/17/2026
v0.12.2Release v0.12.2Low2/17/2026
v0.12.1Release v0.12.1Low2/16/2026
v0.12.0## What's New - **Demo videos on mirroir.dev** — two autoplay videos (Expo Go login flow, Waze→Slack cross-app workflow) with click-to-expand lightbox - **Redesigned landing page** — reordered sections to follow industry-standard dev tool patterns: Hero → Videos → Install → Scenarios → Tools → Integrations → Permissions → FAQ - **Consolidated footer** — GitHub, Docs, Community, and Sponsor links in one place Full changelog: https://github.com/jfarcand/iphone-mirroir-mcp/compare/v0.11.1...v0.12Low2/16/2026
v0.11.1## What's Changed - **Website & README**: Repositioned messaging for both testing and automation audiences, brew.sh-style factual tone - **"Give your AI an iPhone"**: New tagline on mirroir.dev - **curl installer**: `curl -fsSL https://mirroir.dev/get-mirroir.sh | bash` — one-line install from source with SHA256 verification - **Expanded compatibility**: Added Claude Desktop, ChatGPT, Windsurf, Continue, and agent frameworks (OpenClaw, Rowboat, Strands, LangGraph, etc.) to Works With - **WebsitLow2/16/2026
v0.11.0## What's New ### New Tool: `check_health` Comprehensive device health diagnostic that checks mirroring process, window state, helper daemon, Karabiner virtual HID, and screen capture in a single call. Returns `[ok]`/`[WARN]`/`[FAIL]` prefixed status lines. ### Scenario Improvements - **Repeat step type** — loops with `while_visible`, `until_visible`, or `times` modes and a required `max` safety bound - **Basename lookup** — `get_scenario("send-message")` finds `apps/slack/send-message.yaml` aLow2/15/2026
v0.10.0Release v0.10.0Low2/14/2026
v0.9.1Release v0.9.1Low2/14/2026
v0.9.0Release v0.9.0Low2/13/2026
v0.8.0Release v0.8.0Low2/13/2026
v0.7.0Release v0.7.0Low2/10/2026
v0.6.1## Bug Fix - **Swipe direction fix**: Negate scroll wheel values so swipe gestures match iOS convention (swipe up scrolls down, swipe down scrolls up)Low2/10/2026
v0.6.0## What's New **describe_screen** — OCR-based screen element detection using Apple's Vision framework. Returns every visible text element with exact tap coordinates, eliminating the need to visually estimate positions from screenshots. ### Other changes - Helper socket timeout increased from 2s to 5s for long type_text operationsLow2/10/2026
v0.5.2Release v0.5.2Low2/10/2026
v0.5.1Release v0.5.1Low2/10/2026
v0.5.0Release v0.5.0Low2/9/2026
v0.4.3Complete npm install: downloads both MCP server and helper daemon, auto-runs setup on first launch. Fixes broken helper check in v0.4.2.Low2/9/2026
v0.4.1Includes both MCP server and helper daemon binaries plus LaunchDaemon plist for complete npm install.Low2/9/2026
v0.4.0## Route keyboard input through Karabiner virtual HID `type_text` and `press_key` now send keystrokes through the Karabiner virtual HID keyboard via the helper daemon, instead of AppleScript `keystroke`/`key code`. ### Changes - **Activate once, stay there**: iPhone Mirroring is activated via AppleScript only when needed, and the previous app is not restored. This eliminates the per-keystroke Space switching of earlier versions. - **`press_key` via helper**: Special keys (Return, Escape, arrowLow2/9/2026
v0.3.0## What's Changed **Fixed:** Typing (`type_text`) now reliably sends keystrokes to iPhone Mirroring instead of whichever window had focus. ### The Problem (v0.1.0–v0.2.1) The Karabiner virtual HID keyboard sent keystrokes to whichever window had keyboard focus — not iPhone Mirroring. Since MCP clients don't control which macOS window is frontmost, `type_text` was unreliable and often sent input to the wrong app. ### The Fix Typing now uses AppleScript to: 1. Set iPhone Mirroring as the frontmLow2/7/2026
v0.2.1## Changes since v0.2.0 ### Safety hardening - **Removed CGEvent fallback** — tap/type/swipe now refuse with a clear error if the Karabiner helper is unavailable, instead of silently typing into the wrong window - **Skipped characters reported** — type_text now tells you "Typed 4/6 characters. Skipped: éà" instead of claiming success ### Install improvements - **Homebrew tap**: `brew tap jfarcand/tap && brew install iphone-mirroir-mcp` - **One-step installer**: `./install.sh` — builds, configuLow2/7/2026

Dependencies & License Audit

Loading dependencies...

Similar Packages

che-apple-mail-mcp📧 Unlock Apple Mail's potential with 42 powerful tools for full scripting control, enabling advanced mailbox and email management.main@2026-05-31
cupertinoA local Apple Documentation crawler and MCP server. Written in Swift.v1.3.0
seraphAn AI guardian that remembers, watches, and acts.develop@2026-05-12
@elliotding/ai-agent-mcpCSP AI Agent MCP Server - Centralized AI tools distribution and management0.2.18
mcp-arrNo descriptionmain@2026-06-06

More in MCP Servers

AstrBotAgentic IM Chatbot infrastructure that integrates lots of IM platforms, LLMs, plugins and AI feature, and can be your openclaw alternative. ✨
agentscopeBuild and run agents you can see, understand and trust.
claude-plugins-officialOfficial, Anthropic-managed directory of high quality Claude Code Plugins.
langchain4jLangChain4j is an open-source Java library that simplifies the integration of LLMs into Java applications through a unified API, providing access to popular LLMs and vector databases. It makes impleme