iwdp-mcp

iwdp-mcp

iOS Safari debugging via ios-webkit-debug-proxy — MCP server with full WebKit Inspector Protocol support

Category
访问服务器

README

iOS WebKit Debug Proxy MCP Server + CLI

CI Lint Go Report Card License: MIT

Install in Claude Code Install in VS Code Install in VS Code Insiders Install in Cursor Install in Windsurf Install in Codex Install in Antigravity Install in JetBrains

Debug iOS Safari from your AI agent. No existing tool lets AI assistants interact with Safari on a real iPhone. Chrome DevTools MCP speaks CDP, which is incompatible with WebKit. This project bridges that gap.

<video src="https://github.com/user-attachments/assets/dcc0dc05-3a1f-4454-88a8-51ee28da9fd2" poster="https://github.com/user-attachments/assets/3901f7ff-6531-4866-b49e-cf5d17304327" autoplay loop muted playsinline></video>

100+ tools across all 27 WebKit Inspector Protocol domains — navigation, screenshots, DOM inspection, CSS, network interception, httpOnly cookies, JS debugging, heap snapshots, profiling, and more.

Why?

  • Chrome DevTools MCP exists for desktop Chrome. Nothing existed for iOS Safari — until now.
  • httpOnly cookies are invisible to document.cookie. This tool reads them via the protocol.
  • Real device testing catches iOS-specific bugs that simulators miss.
  • Works with Claude Code, VS Code, Cursor, Windsurf, Codex CLI, Antigravity, JetBrains, and any MCP-compatible client.

Installation

Prerequisites

# Install ios-webkit-debug-proxy (macOS)
brew install ios-webkit-debug-proxy

# Connect an iOS device via USB and enable Web Inspector:
# Settings → Safari → Advanced → Web Inspector → ON

For Linux and other platforms, see the ios-webkit-debug-proxy installation guide.

Claude Code Plugin (recommended)

Inside Claude Code, run:

/plugin marketplace add nnemirovsky/iwdp-mcp
/plugin install iwdp-mcp

Go Install

go install github.com/nnemirovsky/iwdp-mcp/cmd/...@latest

Pre-built Binaries

Download from GitHub Releases.

Build from Source

git clone https://github.com/nnemirovsky/iwdp-mcp.git
cd iwdp-mcp
make build

Quick Start

CLI

# Start the proxy
ios_webkit_debug_proxy --no-frontend &

# List connected devices (port 9221)
iwdp-cli devices

# List Safari tabs on the first device (port 9222)
iwdp-cli pages

# Evaluate JavaScript
iwdp-cli eval "document.title"

# Take a screenshot
iwdp-cli screenshot -o page.png

# Show all cookies (including httpOnly)
iwdp-cli cookies

MCP Server

<details id="claude-code"> <summary><strong>Claude Code</strong></summary>

Install as a plugin (recommended):

/plugin marketplace add nnemirovsky/iwdp-mcp
/plugin install iwdp-mcp

Or add to your project's .mcp.json:

{
  "mcpServers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

Or via CLI:

claude mcp add iwdp-mcp -- iwdp-mcp

</details>

<details> <summary><strong>Claude Desktop</strong></summary>

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

{
  "mcpServers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

</details>

<details> <summary><strong>VS Code / VS Code Insiders</strong></summary>

Click the install badges at the top of this README, or add to .vscode/mcp.json:

{
  "servers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

Or via CLI:

code --add-mcp '{"name":"iwdp-mcp","command":"iwdp-mcp"}'

</details>

<details> <summary><strong>Cursor</strong></summary>

Click the Cursor install badge at the top of this README, or add to .cursor/mcp.json:

{
  "mcpServers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

</details>

<details id="windsurf"> <summary><strong>Windsurf</strong></summary>

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

</details>

<details id="codex-cli"> <summary><strong>Codex CLI</strong></summary>

codex mcp add iwdp-mcp -- iwdp-mcp

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

[mcp_servers.iwdp-mcp]
command = "iwdp-mcp"

</details>

<details id="antigravity"> <summary><strong>Antigravity</strong></summary>

Add to ~/.gemini/antigravity/mcp_config.json:

{
  "mcpServers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

</details>

<details id="jetbrains-ides"> <summary><strong>JetBrains IDEs</strong></summary>

Go to Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add, or add the following JSON config:

{
  "mcpServers": {
    "iwdp-mcp": {
      "command": "iwdp-mcp"
    }
  }
}

</details>

Example Prompts

Once the MCP server is configured, you can ask your AI assistant things like:

Getting started

Connect to my iPhone's Safari and show me what tabs are open
Take a screenshot of the current page
What's the page title and URL?

JavaScript & DOM

Run document.querySelectorAll('a') and list all links on the page
Find all elements with class "error" and show their text content
Get the full DOM tree of the page
What event listeners are attached to the submit button?
Highlight the navigation bar so I can see its bounds

CSS & Styles

What CSS rules are applied to the header element?
Show me the computed styles for the main content area
Force the :hover state on the dropdown menu
Change the background color of .hero to #f0f0f0
List all stylesheets loaded on this page

Network

Monitor network requests while I interact with the page
Show me the response body of that failed API call
Intercept all requests to api.example.com and log them
Block all requests to analytics.google.com
Set a custom Authorization header for all requests
Throttle the network to simulate a slow 3G connection
Disable the browser cache and reload the page

Storage & Cookies

Show me all cookies including httpOnly and secure ones
Set a session cookie named "debug" with value "true"
Delete the authentication cookie
What's in localStorage for this site?
Set a localStorage item "theme" to "dark"
List all IndexedDB databases and their object stores
Show me the data in the "users" object store

Debugging

Set a breakpoint in main.js at line 42
Pause execution and show me the call stack
Step through the code and show variable values
What's the source of the script at bundle.js?
Search for "addEventListener" across all loaded scripts
Break on any uncaught exceptions
Set a DOM breakpoint — break when the #content div is modified

Performance & Profiling

Start a timeline recording while I navigate through the app
Take a heap snapshot and find potential memory leaks
Profile the CPU usage while this animation runs
Track memory usage while I scroll through the feed
Force a garbage collection

Advanced

List all compositing layers and why they were composited
Show me all active CSS animations on the page
Capture the canvas content as an image
Get the TLS certificate details for this page
Check if there are any web workers running

How It Works

┌────────────┐    USB     ┌──────────┐   HTTP/WS    ┌──────────┐
│ iOS Device │◄──────────►│   iwdp   │◄────────────►│ iwdp-mcp │
│  (Safari)  │            │ :9221-N  │              │  or CLI  │
└────────────┘            └──────────┘              └──────────┘

ios-webkit-debug-proxy exposes:

  • Port 9221 — lists all connected devices
  • Port 9222+ — each device gets an incremented port listing its Safari tabs
  • Each tab provides a WebSocket URL for the WebKit Inspector Protocol

iwdp-mcp connects to those WebSocket endpoints and exposes 100+ tools.

Tools

Core

Tool Description
iwdp_status Check/auto-start ios-webkit-debug-proxy
restart_iwdp Restart iwdp after a crash (e.g., heap snapshot)
list_devices List connected iOS devices (HTTP GET :9221)
list_pages List Safari tabs (HTTP GET :9222+)
select_page Connect to a specific tab
navigate Go to URL
take_screenshot Capture page as PNG
evaluate_script Run JavaScript
get_document Get DOM tree
query_selector Find elements by CSS selector

DOM & CSS

get_outer_html, get_attributes, get_event_listeners, highlight_node, get_matched_styles, get_computed_style, set_style_text, force_pseudo_state, and more.

Network

network_enable, list_network_requests, get_response_body, set_request_interception, intercept_continue, intercept_with_response, set_emulated_conditions, set_resource_caching_disabled.

Storage

get_cookies (httpOnly + secure), set_cookie, delete_cookie, get_local_storage, get_session_storage, list_indexed_databases, get_indexed_db_data.

Debugging

debugger_enable, set_breakpoint, pause, resume, step_over, step_into, step_out, get_script_source, evaluate_on_call_frame, set_pause_on_exceptions.

Performance

timeline_start/stop, memory_start/stop_tracking, heap_snapshot, cpu_start/stop_profiling, script_start/stop_profiling.

More

Animation, Canvas, LayerTree, Workers, Audit, Security (TLS certificates), and element interaction (click, fill, type_text).

Development

make build              # Build both binaries
make test               # Run all tests
make test-coverage      # Tests with coverage report
make lint               # golangci-lint
make fmt                # gofumpt formatting

Testing

Unit tests use a mock WebSocket server (internal/webkit/testutil/) that simulates the WebKit Inspector Protocol.

# Unit tests (no device needed)
make test

# E2E tests (builds binaries, tests CLI + MCP server JSON-RPC)
make test-e2e

# Integration tests (requires iwdp binary installed)
make test-integration

# Simulator tests — boots iOS Simulator + iwdp, tests ALL tools against real Safari
make test-simulator

iOS Simulator Tests

Simulator tests (-tags=simulator) boot an iOS Simulator, start ios_webkit_debug_proxy with the simulator's web inspector socket, and run every tool against a real Safari page. No physical device needed.

# One-command: setup → test → teardown
make test-simulator

# Or manually for debugging:
make sim-setup          # Prints IWDP_SIM_WS_URL
export IWDP_SIM_WS_URL=ws://localhost:9222/devtools/page/1
go test -tags=simulator ./... -v -run TestSim_Navigate
make sim-teardown

Note: Requires macOS with Xcode and ios-webkit-debug-proxy installed. GitHub Actions macos-latest runners have Xcode and iOS Simulator runtimes pre-installed.

Project Structure

iwdp-mcp/
├── cmd/
│   ├── iwdp-mcp/          # MCP server (stdio transport)
│   └── iwdp-cli/          # CLI tool
├── internal/
│   ├── webkit/            # WebKit Inspector Protocol client
│   │   ├── client.go      # WebSocket connection + message routing
│   │   ├── types.go       # Protocol type definitions
│   │   ├── domains.go     # Domain enable/disable helpers
│   │   └── testutil/      # Mock WebSocket server
│   ├── tools/             # Tool implementations (shared by both binaries)
│   └── proxy/             # iwdp process detection + management
├── skills/                # Claude Code skill definition
├── .claude-plugin/        # Claude Code plugin manifest
└── .mcp.json              # MCP server configuration

License

MIT — see LICENSE.

ios-webkit-debug-proxy is a separate project licensed under BSD-3-Clause. This tool connects to it over HTTP/WebSocket at runtime without bundling its code.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选