Skip to main content
Glama

peeko

Let Claude see your mobile app. Peeko is an MCP server that hands Claude screenshots of your iOS Simulator, Android emulator, or a physical Android device plugged into USB.

It is deliberately read-only. Peeko observes; it never taps, swipes, or types. Claude can look at what your app is rendering and reason about it — a layout that broke, a state you can't reproduce in words, a diff between what you meant and what shipped — without ever touching the device.

You:    Why does the login screen look wrong on the iPhone 16?
Claude: [screenshot_ios] The "Continue" button is clipped — its container has a
        fixed height of 44pt but the text wraps to two lines at this width.

Requirements

Platform

iOS Simulators

Android devices & emulators

macOS

✅ Xcode required

adb required

Linux

❌ not possible

adb required

Windows

❌ not possible

adb required

iOS support is macOS-only, and always will be: it relies on xcrun simctl, which ships with Xcode and does not exist on other operating systems. On Linux and Windows the three iOS tools return a clear error and the Android tools work normally.

Node.js 18 or later is required.

Installing the prerequisites

  • Xcode command line tools (macOS, for iOS): xcode-select --install

  • Android platform tools (all platforms, for Android):

    • macOS — brew install --cask android-platform-tools

    • Linux — apt install android-tools-adb (or your distribution's equivalent)

    • Windows — winget install Google.PlatformTools

Make sure adb ends up on your PATH. Peeko tells you so explicitly if it doesn't.

Related MCP server: macOS Simulator MCP Server

Install

Every agent at once

add-mcp detects the agents installed on your machine and writes the right config for each one:

npx add-mcp peeko@latest

Add -g to install globally rather than for the current project, and -a to target specific agents — claude-code, claude-desktop, codex, cursor, gemini-cli, goose, opencode, vscode, zed.

Claude Code

As a plugin, which needs no MCP configuration at all:

claude plugin marketplace add rocktane/peeko
claude plugin install peeko@peeko

Or as a plain MCP server:

claude mcp add peeko -- npx -y peeko@latest

Codex

codex mcp add peeko -- npx -y peeko@latest

opencode

opencode is configured by file only. In opencode.json:

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

Cursor, Claude Desktop, and other MCP clients

Add this to your client's MCP configuration:

{
  "mcpServers": {
    "peeko": {
      "command": "npx",
      "args": ["-y", "peeko@latest"]
    }
  }
}

Tools

Tool

What it does

list_ios_simulators

Lists every booted iOS Simulator, with its UDID.

screenshot_ios

Returns a PNG of a Simulator's screen.

info_ios

Name, OS version and screen size of a Simulator.

list_android_emulators

Lists every connected Android device and emulator.

screenshot_android

Returns a PNG of a device's screen.

info_android

Name, OS version and screen size of a device.

Every tool takes an optional device_id — a Simulator UDID on iOS, a device serial on Android. Omit it and Peeko picks the first available device, which is what you want when only one is running.

Usage

Boot a simulator or emulator, then just ask:

Take a screenshot of the simulator and tell me if the spacing looks right.

Compare the Android and iOS home screens side by side.

The list is empty on Android but not on iOS — screenshot both and tell me what differs.

Privacy

Screenshots are sent to the model, exactly like any other tool result. Whatever is on the device screen goes with them — test accounts, tokens in a debug overlay, a customer's real data if you are pointed at production. Peeko cannot tell the difference. Check what's on screen before you ask for a capture.

Peeko never writes to the device, never installs anything on it, and never sends data anywhere other than the MCP client that invoked it.

Development

Peeko is written in TypeScript. It runs on Node in production, and uses Bun as the dev runtime and test runner.

bun install
bun test           # unit tests on the parsers
bun run typecheck  # tsc --noEmit
bun run build      # tsc → dist/
bun run start      # run the server from source over stdio

The repo ships a .mcp.json that points at src/index.ts, so opening it in Claude Code gives you the server you're editing, live.

Layout

src/
  index.ts            MCP server: tool registration and stdio transport
  tools/              one handler per tool; formats MCP results
  platforms/
    ios.ts            xcrun simctl
    android.ts        adb
    exec.ts           subprocess helper; turns ENOENT into actionable errors
    png.ts            reads dimensions from a PNG's IHDR chunk
test/
  parsers.test.ts     covers the pure parsing functions

The device-facing code shells out to xcrun and adb, so it can't be unit-tested without hardware. The parsers it depends on are pure functions and are tested directly — including CRLF handling, which is what makes Android work on Windows.

Contributing

Issues and pull requests are welcome. Please run bun test and bun run typecheck before opening a PR; CI runs both on Linux, macOS and Windows.

License

MIT © Yohan (@rocktane)

Available Tools

6 tools
info_androidA

Get detailed info about an Android device/emulator (name, OS version, screen size)

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoDevice serial (defaults to first connected device)

TDQS

A3.7/5.0
Behavior3/5

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

No annotations provided. Description states it returns detailed info but lacks details on read-only nature, output format, prerequisites (e.g., device connection), or error conditions. Adequate but minimal.

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?

Single sentence with no waste. Action and resource front-loaded. Brief and to the point.

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?

Simple tool with one optional parameter. Description gives purpose and sample output fields but lacks output schema or return format details. Adequate for simplicity but could be more complete.

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?

Input schema covers 100% of parameters with description. Description adds no additional parameter context beyond the schema. Baseline score of 3 applies.

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

Purpose5/5

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

Clearly states it gets detailed info about an Android device/emulator and lists example fields (name, OS version, screen size). Distinguishes from siblings: info_ios is for iOS, list tools list devices.

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

Usage Guidelines3/5

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

Implied usage (when you need device details) but no explicit when-to-use or when-not-to-use. No mention of alternatives like list_android_emulators for obtaining device IDs first.

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

info_iosA

Get detailed info about an iOS Simulator (name, OS version, screen size). (macOS only)

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoSimulator UDID (defaults to first booted simulator)

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the tool is read-only (get info) and platform-specific (macOS). However, it does not mention error conditions, permission requirements, or the return format structure, leaving some behavioral uncertainty.

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, well-structured sentence that front-loads the purpose and includes key constraints. Every part contributes value, with no unnecessary words.

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

Completeness4/5

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

Given the tool's simplicity (one optional param, no output schema, no annotations), the description covers purpose, platform, and return content. It could be more complete by listing expected return fields, but is adequate for an agent to understand usage.

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 input schema has 100% coverage with a single optional parameter 'device_id'. The description adds value by noting it defaults to the first booted simulator, which is not in the schema. This clarifies behavior beyond what the schema provides.

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

Purpose5/5

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

The description clearly states the tool retrieves detailed info about an iOS Simulator, listing specific details (name, OS version, screen size). It distinguishes itself from sibling tools like 'list_ios_simulators' (which lists all simulators) and 'info_android' (Android counterpart).

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

Usage Guidelines3/5

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

The description mentions 'macOS only,' which is a key usage constraint. However, it does not provide explicit guidance on when to use this tool versus alternatives (e.g., when needing a list vs. details on a specific simulator). No exclusion scenarios are given.

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

list_android_emulatorsB

List all connected Android devices and emulators

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior1/5

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

No annotations provided, and description does not disclose behavioral traits such as read-only nature, permission requirements, or side effects.

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?

Single sentence with no wasted words, perfectly concise and front-loaded.

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?

Simple tool, but lacks description of return format or behavior; could be improved with minimal extra context.

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?

No parameters exist, so description adds no parameter meaning but meets baseline for zero-param tools.

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

Purpose5/5

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

Description clearly states 'List all connected Android devices and emulators', using specific verb and resource, and distinguishes from sibling tools like list_ios_simulators.

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 on when to use this tool versus alternatives; missing context on prerequisites or exclusions.

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

list_ios_simulatorsA

List all booted iOS Simulators (macOS only)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided. Description indicates a harmless list operation but does not disclose output format, error conditions, or dependencies like Xcode. Minimal but adequate for a simple read tool.

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?

Single sentence, front-loaded with key information, no unnecessary words.

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

Completeness4/5

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

For a zero-parameter list tool, the description covers purpose and platform constraint. Lacks details on output, but sufficient for the tool's simplicity.

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?

No parameters in schema, schema coverage 100%. Description does not need to add parameter details. Baseline of 4 is appropriate.

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

Purpose5/5

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

Description clearly states verb 'List', resource 'booted iOS Simulators', and platform constraint 'macOS only'. It distinguishes from sibling tools like list_android_emulators and screenshot_ios.

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

Usage Guidelines4/5

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

Explicitly mentions macOS-only operation, providing clear context for when to use. No explicit when-not or alternatives, but siblings are different platforms/functions.

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

screenshot_androidB

Take a screenshot of an Android device/emulator screen. Returns a PNG image.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoDevice serial (defaults to first connected device)

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description should disclose behaviors. It only states the action and return type, omitting details like required connection, potential blocking, or side effects. This is minimal transparency.

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?

Two sentences, no unnecessary words. Every part contributes to understanding the tool's core function.

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?

For a simple one-parameter tool with no output schema, the description is adequate but minimal. It doesn't mention error conditions, device requirements, or output format details beyond 'PNG image'. Sufficient for basic use but not comprehensive.

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?

Schema coverage is 100% for the single parameter, with a clear description in the schema. The tool description adds no extra value beyond what the schema already provides, so baseline 3 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 clearly states the action (take a screenshot) and the target (Android device/emulator), implicitly distinguishing from screenshot_ios by platform. It lacks explicit differentiation but is specific enough.

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 on when to use this tool versus alternatives like screenshot_ios or info tools. No mentions of prerequisites or context.

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

screenshot_iosA

Take a screenshot of an iOS Simulator screen. Returns a PNG image. (macOS only)

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idNoSimulator UDID (defaults to first booted simulator)

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It states the return format (PNG) and OS restriction (macOS only), but does not disclose error handling (e.g., if no simulator is booted) or prerequisites (simulator must be booted). Basic transparency is present but gaps remain.

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 extremely concise: one sentence covering action, target, return type, and platform constraint. No unnecessary words or repetition.

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

Completeness4/5

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

For a simple tool with one optional parameter and no output schema, the description covers the core purpose, output, and platform. However, it lacks error behavior hints or guidance on retrieving device_id (e.g., via list_ios_simulators), which would improve 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 schema already provides a description for the only parameter (device_id) with a default explanation. The tool description adds no additional semantic value beyond what the schema offers. With 100% schema coverage, baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action (take a screenshot), the target (iOS Simulator screen), and the output (PNG image). The sibling tool screenshot_android is for Android, making this tool's purpose distinct.

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

Usage Guidelines3/5

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

The description mentions 'macOS only', implying a system constraint, but does not explicitly advise when to use this tool versus alternatives like screenshot_android or list_ios_simulators. Usage context is implied but not fully elaborated.

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. 6 tool updatesv1.0.0
    • First observedinfo_android
    • First observedinfo_ios
    • First observedlist_android_emulators
    • First observedlist_ios_simulators
    • First observedscreenshot_android
    • First observedscreenshot_ios

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a specific platform (Android or iOS) and action (info, list, screenshot), with no overlap or ambiguity.

Naming Consistency5/5

All tools follow a consistent pattern: <action>_<platform> (e.g., info_android, list_ios_simulators), using lowercase with underscores.

Tool Count5/5

Six tools cover the core operations for two platforms (listing, info, screenshots) without excess or deficiency.

Completeness5/5

The tool surface is complete for the stated purpose of retrieving device/simulator info, listing, and screenshots; no obvious gaps.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A server enabling programmatic control over Android devices through ADB, providing capabilities like screenshot capture, UI layout analysis, and package management that can be accessed by MCP clients like Claude Desktop.
    807
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that enables Claude Code to visually test and control iOS simulators, Android emulators, and real devices through 22 automation tools. It automatically generates test reports with screenshots for mobile app testing directly from the terminal.
    24
    8 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that lets AI agents control iOS and Android devices (tap, scroll, type, take screenshots, read UI trees, and run code). Works with multiple devices at the same time.
    123 npm
    45
    MIT