MCP server + CLI for debugging iOS Safari via ios-webkit-debug-proxy.
Speaks WebKit Inspector Protocol natively — full access to all 27 WebKit Inspector domains, including httpOnly cookies, network interception, heap snapshots, and more.
Inside Claude Code, run:
/plugin marketplace add nnemirovsky/iwdp-mcp
/plugin install iwdp-mcp
# Install both binaries
go install github.com/nnemirovsky/iwdp-mcp/cmd/...@latest# Or download a pre-built binary from GitHub Releases
# https://github.com/nnemirovsky/iwdp-mcp/releasesgit clone https://github.com/nnemirovsky/iwdp-mcp.git
cd iwdp-mcp
make build# 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 → ONFor Linux and other platforms, see the ios-webkit-debug-proxy installation guide.
# 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 cookiesClaude Code
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-mcpClaude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"iwdp-mcp": {
"command": "iwdp-mcp"
}
}
}VS Code / VS Code Insiders
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"}'Cursor
Click the Cursor install badge at the top of this README, or add to .cursor/mcp.json:
{
"mcpServers": {
"iwdp-mcp": {
"command": "iwdp-mcp"
}
}
}Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"iwdp-mcp": {
"command": "iwdp-mcp"
}
}
}Codex CLI
codex mcp add iwdp-mcp -- iwdp-mcpOr add to ~/.codex/config.toml:
[mcp_servers.iwdp-mcp]
command = "iwdp-mcp"Antigravity
Add to ~/.gemini/antigravity/mcp_config.json:
{
"mcpServers": {
"iwdp-mcp": {
"command": "iwdp-mcp"
}
}
}JetBrains IDEs
Go to Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add, or add the following JSON config:
{
"mcpServers": {
"iwdp-mcp": {
"command": "iwdp-mcp"
}
}
}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
┌────────────┐ 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.
| 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 |
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_enable, list_network_requests, get_response_body, set_request_interception, intercept_continue, intercept_with_response, set_emulated_conditions, set_resource_caching_disabled.
get_cookies (httpOnly + secure), set_cookie, delete_cookie, get_local_storage, get_session_storage, list_indexed_databases, get_indexed_db_data.
debugger_enable, set_breakpoint, pause, resume, step_over, step_into, step_out, get_script_source, evaluate_on_call_frame, set_pause_on_exceptions.
timeline_start/stop, memory_start/stop_tracking, heap_snapshot, cpu_start/stop_profiling, script_start/stop_profiling.
Animation, Canvas, LayerTree, Workers, Audit, Security (TLS certificates), and element interaction (click, fill, type_text).
make build # Build both binaries
make test # Run all tests
make test-coverage # Tests with coverage report
make lint # golangci-lint
make fmt # gofumpt formattingUnit 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-simulatorSimulator 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-teardownNote: Requires macOS with Xcode and
ios-webkit-debug-proxyinstalled. GitHub Actionsmacos-latestrunners have Xcode and iOS Simulator runtimes pre-installed.
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
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.