Skip to main content
Glama

Mobile Xray MCP

πŸ”¬ Take screenshots and analyze your mobile apps with AI assistance - right from your IDE.

License Node.js MCP

Privacy First β€’ Built by Developers for Developers β€’ Works Locally

About

I've been building mobile apps for the last 10 years, and one thing that's been consistently challenging without a dedicated UX designer is knowing whether the screens I create are actually user-friendly and intuitive.

Now, this has become dramatically easier. With Mobile Xray MCP, you can ask your favorite AI-powered IDE (Claude, Cursor, Windsurf, VS Code) to take a screenshot of your app and give you instant suggestions on what to improve. No more guessing about UI/UX decisions - get feedback directly in your development workflow.

This tool bridges the gap between development and design by bringing mobile app analysis capabilities directly into your coding environment, making it easier than ever to create polished, user-friendly mobile applications.

Related MCP server: Enhanced ADB MCP Server

Features

  • πŸ”’ Privacy First: All automation happens locally on your machine - your app screenshots and data never leave your device

  • ⚑ Fast: Direct communication with local simulators and emulators for instant feedback

  • πŸ“± Cross-Platform: Supports both iOS simulators and Android emulators

  • πŸ€– AI-Powered: Integrates seamlessly with AI coding assistants for intelligent analysis

  • πŸ‘¨β€πŸ’» Developer-Focused: Built by developers who understand the mobile development workflow

⚑ Quick Start

Prerequisites: Node.js 18+, iOS Simulator or Android Emulator

Add to your IDE config file:

{
  "mcpServers": {
    "mobile-xray": {
      "command": "npx",
      "args": ["-y", "@cultivx/mobile-xray-mcp"]
    }
  }
}

Test: Restart IDE β†’ Start simulator β†’ Ask: "Take a screenshot of my iOS simulator"

Setup Details

Prerequisites

System Requirements:

  • Node.js 18+ (check with node --version)

  • macOS 10.15+ (for iOS development)

  • macOS/Windows/Linux (for Android development)

For iOS Development:

  • Xcode Command Line Tools: xcode-select --install

  • Xcode with iOS Simulator support

  • At least one iOS Simulator installed

For Android Development:

  • Android Studio (includes adb and emulator commands)

  • Android SDK tools in your PATH

  • At least one Android Virtual Device (AVD) created

Verify Your Setup:

# Test Node.js version
node --version  # Should show v18.0.0 or higher

# Test iOS tools (macOS only)
xcrun simctl list devices | head -5

# Test Android tools
adb version

Setup Instructions

For Cursor: See Cursor MCP Documentation

For Claude Desktop: See Claude MCP Quickstart

For Windsurf: See Windsurf MCP Documentation

For VS Code: See VS Code MCP Documentation

Note: This MCP server works with any AI coding assistant that supports the Model Context Protocol.

Basic Usage

  1. Start your mobile simulator/emulator

  2. Open your AI chat in your IDE

  3. Ask for a screenshot: "Can you take a screenshot of my iOS simulator?"

  4. Get AI analysis: "What can I improve about this screen's UX?"

Example Prompts

Platform & Setup

Check which platforms are currently supported by the mobile-xray-mcp on my machine

Accessibility

Take a screenshot of my iOS simulator and tell me what accessibility features I should add
Screenshot my current screen and check if the color contrast meets accessibility standards

UI/UX Feedback

Take a screenshot of the current iOS simulator, and find the code that is related to it, then propose some improvements without making any changes
Take a screenshot of my app and suggest improvements for mobile-first design principles
Analyze the current screen layout and suggest improvements for better user flow

Change and Verify

Make changes and verify your changes work well by taking a screenshot

Troubleshooting & FAQ

Issues:

  • "No simulators found": Start your simulator with open -a Simulator (iOS) or check adb devices (Android)

  • MCP not connecting: Restart your IDE after adding config, verify JSON syntax is correct

  • "Command not found": Install Xcode Command Line Tools (xcode-select --install) or ensure Android SDK is in PATH

Common Questions:

  • Frameworks: Works with React Native, Flutter, Xamarin, or any app in simulator/emulator

  • Physical devices: Not yet supported, simulators/emulators only

  • Privacy: The MCP server operates locally and doesn't collect or send any data. Screenshot images are sent to your AI service by your IDE for analysis

  • Offline: Screenshots work offline, AI analysis needs internet connection

Current Features

βœ… Platform Detection: Automatically checks which mobile platforms are available on your system

βœ… Privacy First: All processing performed by the MCP server happens locally - no data sent to external servers. However, screenshot images will be sent to your AI service (Claude, ChatGPT, etc.) for analysis, as handled by your IDE's AI agent

βœ… Screenshot Capture: Take instant screenshots of iOS simulators and Android emulators

βœ… Cross-Platform Support: Works with both iOS and Android development environments

βœ… IDE Integration: Seamlessly works with popular AI-powered IDEs and coding assistants

Next Features

🚧 Interactive Navigation: Enable AI assistants to navigate through your app interface

Contributing

We welcome contributions! Here's how you can help:

  1. Fork this repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

I'll review all PRs and provide feedback. Whether it's bug fixes, new features, or documentation improvements - all contributions are appreciated!

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Support


Made with ❀️ by developers, for developers

Available Tools

3 tools
check_supported_platformsB
Read-only

Check which platforms are supported

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true already indicates this is a safe read operation, and the description aligns with that. However, it adds no extra behavioral context such as output format, latency, or any side effects, so it meets the baseline without exceeding it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, short sentence that communicates the purpose without any unnecessary words or repetition. It is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (no parameters, no output schema), but the description does not specify what the result will look like or what 'platforms' refers to in context. Given the simplicity, this is minimally adequate but could we benefit from mentioning the return type or examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema already covers everything (100% coverage). With no parameters, there is no need for parameter explanation, so the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the verb 'Check' with the resource 'platforms', clearly indicating a read/query operation. It is distinct from sibling tools like get_simulator_screenshot and get_simulator_list, which focus on simulators, though the term 'platforms' is somewhat broad.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. There is no mention of use cases, prerequisites, or exclusions, leaving the agent to infer from the tool name and siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_simulator_listC
Read-only

Get a list of all simulators

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYesThe state of the simulator
platformYesThe platform of the simulator

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint: true, which covers the safety profile. The description adds no further behavioral contextβ€”no mention of filtering semantics, return format, or any side effects. The word 'all' could be seen as contradictory to the required filters, but this is more a clarity issue than a transparency issue.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no wasted words. However, the use of 'all' is imprecise given the required filters, which slightly reduces structural quality. Still, it is well under the typical length and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool, the description is incomplete. It does not mention that platform and state are required filters, what the output list contains, or whether there are any limitations or pagination. The schema does provide parameter details, but the description leaves out essential contextual information about the return value and invocation prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters (platform and state) with enums, so schema coverage is 100%. The description 'Get a list of all simulators' adds no parameter-specific meaning beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action ('Get a list') and resource ('simulators'), distinguishing it from siblings like get_simulator_screenshot and check_supported_platforms. However, the phrase 'all simulators' is slightly misleading because the required parameters indicate the list is filtered by platform and state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It merely states what it does, leaving the agent to infer usage context. There is no mention of exclusions or alternative tools, despite the presence of sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_simulator_screenshotC
Read-only

Get a screenshot of the iOS simulator

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceIdYesThe UDID for the iOS simulator, and the emulator ID for the Android simulator
platformYesThe platform of the simulator

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations provide readOnlyHint=true, so the agent knows it's a safe read operation. The description adds no additional context such as output format, platform nuances, or side effects. Moreover, the reference to 'iOS simulator' conflicts with the schema's support for Android, misrepresenting the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, short sentence, making it easy to read. However, it includes the inaccurate 'iOS' qualifier, which reduces precision despite its brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters and no output schema, the description is too minimal. It doesn't mention that the platform parameter can be 'android', nor does it describe what the screenshot output looks like (e.g., file path, base64). The readOnly annotation covers safety but not functional completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with descriptive comments for both deviceId and platform, including an enum. The tool description adds no extra parameter meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' and resource 'screenshot', and it clearly differs from sibling tools like get_simulator_list. However, it inaccurately limits the tool to 'iOS simulator' when the schema explicitly supports both iOS and Android, making the purpose slightly misleading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool or how it relates to alternatives like get_simulator_list or check_supported_platforms. The description only states what it does, leaving the agent to infer when it should be invoked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.0.6
    • First observedcheck_supported_platforms
    • First observedget_simulator_list
    • First observedget_simulator_screenshot

TDQS

B3.3/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a distinct concern: capturing screenshots, listing simulators, and checking platform support. There is no overlap or ambiguity between them.

Naming Consistency4/5

Most tools follow a get_ pattern, but check_supported_platforms uses check_ instead. This is a minor deviation from an otherwise clear verb_noun convention.

Tool Count4/5

Three tools is a reasonable count for a focused utility server. It is not overly sparse, though it could benefit from one or two more related tools to feel more substantial.

Completeness3/5

The tool set covers basic simulator operations and platform discovery, but lacks common related operations such as booting a simulator or retrieving device details. It feels incomplete for broader mobile testing workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to capture screenshots from Android devices and emulators, and manage connected devices for UI analysis and testing. Supports device listing, screenshot capture, and integrates with Claude Desktop, Gemini CLI, and GitHub Copilot.
    2
    38 npm
    24
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Enables comprehensive control of Android devices via ADB for Flutter development, UI testing, and visual QA workflows. Provides 60+ tools for device management, UI inspection, app testing, performance profiling, and debugging through natural language.
    77
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to view and analyze screenshots from React Native/Expo applications for AI-powered mobile UI development. Integrates with Claude, Cursor, VS Code and other MCP-compatible editors.
    6 npm
    15
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to interact with iOS Simulators and Android Emulators, allowing autonomous app development, UI interaction, profiling, and debugging through natural language.
    76
    2,849
    Apache 2.0