MCP server for iOS simulator screenshots and web browser debugging

AppContext is an open MCP endpoint that gives your AI coding agent live visual access to what you're building. iOS simulator or Chrome browser, one server, one connection string.

Published · Updated

Why a dedicated MCP server for this?

AI coding agents like Claude Code, Cursor, and Windsurf are fluent at reading files, running commands, and editing code. The one thing they can't do natively is see your app. That's a real gap when you're debugging layout bugs, visual regressions, or user-flow issues.

The Model Context Protocol lets AI agents call external tools. So the fix is a tool that takes a screenshot and returns it. AppContext is that tool, wrapped in a native macOS app with the plumbing already handled: iOS Simulator bridging, Chrome DevTools Protocol connection, permissions, and licensing.

What AppContext exposes over MCP

fetch_liveview

Returns a PNG of the currently-selected platform. In iOS mode, this uses xcrun simctl io booted screenshot to grab a fresh capture of the booted simulator. In web mode, it connects to a running Chrome instance (started with --remote-debugging-port=9222) and captures the active tab.

The screenshot is returned base64-encoded in the MCP tool response, so the AI agent sees it inline — no file download, no staging step.

fetch_recent_logs

Streams recent output from the Metro bundler (React Native / Expo apps). The AI gets the same stack traces, warnings, and console.log output you see in your own terminal.

fetch_web_console

For web apps, this returns the Chrome DevTools console buffer: errors, warnings, logs, with timestamps. Useful when the AI needs to see a runtime exception that only shows up in the browser, not in the terminal.

switch_platform

Flips the context between iOS and web. You can also switch from AppContext's menu bar UI; the MCP tool is there so AI agents can switch themselves when they need to.

get_browser_tabs

Lists open Chrome tabs so the AI can pick the right one if you have multiple dev servers running (e.g. localhost:3000 and localhost:5173 both open).

fetch_device_status

Reports which platform is active and whether a simulator or browser is actually connected. This is the tool that lets an agent distinguish "nothing is running" from "the screen really is blank" before it starts guessing at a fix.

iOS support: the details

AppContext works with any iOS simulator booted from Xcode, including React Native and Expo apps running in Expo Go or a dev client.

Android support via adb is on the roadmap.

Web support: the details

AppContext uses the Chrome DevTools Protocol (CDP) via puppeteer-core to talk to your browser. That means no browser extension to install and full compatibility with any Chromium-based browser (Chrome, Edge, Brave, Arc).

Chrome 136 changed the rules for --remote-debugging-port

Since Chrome 136, the remote-debugging switches are ignored when they point at Chrome's default profile directory. If you launch Chrome with --remote-debugging-port=9222 alone and nothing can connect, that's almost always why. Pair it with a non-default profile, for example --user-data-dir="$HOME/.chrome-appcontext". The trade-off is a separate profile: your extensions and logged-in sessions from the everyday profile aren't there, so you may need to sign in again to whatever your dev site talks to. AppContext's own "Launch Chrome with Debugging" action starts Chrome with its own profile directory, so it isn't affected by the restriction.

Connection string

AppContext runs a local Server-Sent Events (SSE) endpoint at http://localhost:7777/sse. Every MCP client configures it the same way — and the type field matters, since Claude Code reads a url entry with no type as a stdio server and skips it:

{
  "mcpServers": {
    "appcontext": {
      "url": "http://localhost:7777/sse",
      "type": "sse"
    }
  }
}

How it compares to alternatives

The short version is below; for a fuller decision framework that also covers Claude Code's built-in computer use and the official browser MCP servers, see the four ways to let Claude Code see your app.

BrowserTools MCP

BrowserTools MCP (AgentDeskAI) is a popular community project — about 7,300 GitHub stars — that provides similar web-screenshot and console-log functionality via a browser extension. It works, but development has been quiet: the last tagged release is v1.2.0 from March 2025, and commits since then have been documentation changes rather than code (checked August 2026). It also requires installing an extension, and it doesn't cover iOS. AppContext ships as a single signed macOS app with both platforms built in, and talks to Chrome over the DevTools Protocol rather than through an extension.

Generic screenshot MCP servers

There are a handful of single-tool MCP servers on GitHub that wrap puppeteer.screenshot(). They work for taking a screenshot of a random URL, but they don't connect to your running dev environment, don't see your local state, and don't capture console logs or Metro output.

iOS-focused MCP servers

Several actively maintained projects wrap the iOS toolchain for MCP clients, and they're worth knowing about because they solve adjacent problems:

Those are UI-automation and build tools that happen to expose a capture. AppContext is built around the capture loop itself: a fresh screenshot on every call, Metro and browser console logs beside it, the same endpoint for web, and the hub and policy layer over every other MCP server you use — in one signed macOS app rather than a per-project npx entry. If what you need is "drive the simulator" or "build and test from the agent", one of the projects above is likely the better fit, and nothing stops you running it as an upstream server inside AppContext's hub.

Privacy and data flow

AppContext runs entirely on your machine. Screenshots are captured locally and sent over localhost to your MCP client. They do not pass through any remote server. Login and subscription management use Supabase, but screenshot payloads stay local.

Frequently asked questions

Why does Chrome ignore --remote-debugging-port?

Since Chrome 136, the remote-debugging switches are ignored when pointed at Chrome's default profile directory. Pair the flag with a non-default profile, for example --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-appcontext". AppContext's own "Launch Chrome with Debugging" action uses its own profile directory and isn't affected.

How does AppContext capture an iOS simulator screenshot?

It shells out to xcrun simctl io booted screenshot, the same mechanism Xcode uses, and returns the PNG base64-encoded in the MCP tool response so the agent sees it inline.

Does AppContext support Android?

Not today. AppContext currently covers the iOS Simulator and Chromium-based browsers on macOS. Android support via adb is on the roadmap and is not shipped.

Give every AI tool visual access to your app

One macOS app, one MCP endpoint, every major AI coding client.

Get AppContext Free