Deckhand
Enables Claude to build and preview mobile apps on multiple iOS and Android devices simultaneously, with live streaming and touch control, all via MCP.
README
Deckhand
Ask Claude for your app on any device — get a link.
Deckhand is an MCP server that runs on a Mac. Connect it to Claude (claude.ai, Claude Code, Routines — any MCP client) and ask:
"Test the onboarding screens on iOS 26 and Android 14 for PR #42"
You get back one calm page showing every device live, with full touch control — shareable publicly or behind a PIN. Claude can also see and drive the devices itself (screenshot, accessibility tree, tap/type) before it hands you the link.
How it works
- You ask — Claude calls
start_previewwith an app id, a ref/PR, and devices. - Deckhand builds — checks out the branch into a worktree (or builds a registered local checkout in place), builds once per platform, installs on every device.
- Devices boot in parallel — iOS simulators via
simctl, Android emulators viaavdmanager/adb. - You get a link — a stable per-app share URL streaming all devices live, riding a Cloudflare tunnel. No VPN, no WebRTC, no TURN — if a network can reach claude.ai, it can view and control a preview.
Architecture
One Node process owns everything. Nothing but cloudflared is reachable from outside
the machine.
claude.ai / Claude Code / any MCP client share-link viewers (any browser)
│ HTTPS │ HTTPS/WSS
└───────────────────┬──────────────────────────┘
▼
cloudflared named tunnel → http://127.0.0.1:4300
│
┌───────────────────────────▼── deckhand server (loopback only) ──┐
│ │
│ /mcp/<token> MCP tools, per-person token, role-gated│
│ /s/<shareId> viewer page (device grid + controls) │
│ /s/<shareId>/dev/<id>/* scoped proxy → that device's stream │
│ │
│ auth → mcp tools → preview engine → devices → streaming │
│ │ │ │ │ │
│ audit log git worktrees simctl / serve-sim (iOS) │
│ + build recipes adb adb-screencap │
│ (Android) │
└─────────────────────────────────────────────────────────────────┘
on-disk: ~/.deckhand/{config.yaml, apps.yaml, tokens.yaml, state.json, audit.jsonl}
Building blocks
| Module | What it does |
|---|---|
server/src/mcp/ |
The MCP surface: previews, screenshots, UI tree, test runs, app registration |
server/src/engine/ |
Preview state machine, build recipes (Expo / RN / NativeScript), app-type detection, worktrees, dev-server lifecycle |
server/src/devices/ |
iOS (simctl) and Android (avdmanager/emulator/adb) control, tool env resolution |
server/src/streaming/ |
Swappable StreamingBackend seam — serve-sim H.264 for iOS, adb-screencap for Android (scrcpy is the planned upgrade) |
server/src/share/ |
Share ids, PIN protection, and the scoped HTTP+WS proxy (video + input, nothing else) |
server/src/github/ |
Credential ladder: PAT → GitHub App → ambient gh → anonymous (public repos) |
server/src/cli.ts |
deckhand CLI: init, serve, doctor, token, app, env |
viewer/ |
The single calm page: WebCodecs stream client, touch/keyboard input, device picker |
Stack: Node ≥ 22, TypeScript, ESM. No database, no SPA framework beyond the one viewer page, a ruthlessly short dependency list.
Two ways to run an app
- Git mode — Deckhand clones the repo, fetches any ref or PR into a detached worktree, and builds there. Fully self-contained.
- Local mode (daily dev loop) — register an existing checkout with
deckhand app add <id> --path <dir>. Built in place, never mutated: Deckhand reads the checkout's git state but never writes to it.restart_preview(or the viewer's Rebuild button) rebuilds on the same booted devices.
Security model
- Everything binds loopback; the only way in is the Cloudflare named tunnel.
- No tokenless paths: per-person MCP tokens, per-app share links (optionally PIN-gated).
- The MCP surface is capability-bounded — no arbitrary commands, only pre-registered apps and their repos' refs. Every call lands in an append-only audit log.
- Secrets never travel through MCP; tokens never appear in argv, URLs, or logs.
Status
Phases 1, 2 & 2.5 done — iOS + Android multi-device previews, local dev mode, and agent-driven test runs, validated end-to-end on real hardware over a live tunnel (168 tests, CI green). Next: Phase 3 (password shares, agent-led onboarding contract) and Phase 4 (ops hardening + AI setup runbook).
The complete build plan lives in PLAN.md.
Run it (dev)
npm install
npm run build --workspace @deckhand/viewer # build the viewer once
deckhand init --hostname <host> --github-app-id <id> --github-app-pem <path.pem>
deckhand token add <you> --role admin # prints your connector URL
deckhand app add <id> github.com/owner/repo # or: --path <local-checkout>
npm run dev # or: deckhand serve
deckhand doctor --smoke # end-to-end check on the Mac
License
Deckhand is released under the MIT License.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.