Zero-config file & clipboard sharing on your LAN — with a built-in cross-device MCP fabric so the AI agents on your laptop, phone, and Pi can see each other's tools.
Run SafeDrop on two devices on the same Wi-Fi — they find each other, pair with a 4-digit code, and from then on you can drop files and clipboard between them end-to-end encrypted. Layer 2 is the cross-device MCP fabric: any AI agent (Claude Code, Cursor, Goose, Cline, Claude Desktop) on one device can call tools exposed by the others — read the phone's clipboard, take a photo with the phone's camera, run a shell command on a remote box — all over the same encrypted channel.
X25519 ECDH → HKDF-SHA256 → Fernet (AES-128-CBC + HMAC-SHA256). Pair-code confirms the handshake. Same wire format byte-for-byte across Python / Kotlin / Swift.
UDP broadcast on the LAN. No router setup, no accounts, no QR codes. Manual-peer mode lets you connect across LANs with Tailscale or our discovery beacon.
Stdio for Claude Code / Cursor / Goose / Cline. HTTP Streamable-MCP with bearer tokens for cloud agents. Bridge other MCP servers under one namespace.
Python desktop GUI (tkinter), Kotlin Jetpack Compose Android app, Swift SwiftUI iOS app, headless CLI, MCP server. All speak the same protocol.
Persistent agent_id per device. send_message / recv_messages / list_agents let agents on different boxes talk to each other autonomously.
Per-(peer, tool) decisions persisted to ~/.safedrop/trust.json. Every cross-device call lands in an append-only audit log. Capability tokens for scoped HTTP access.
Same protocol, three native implementations, four MCP tool sources.
Desktop / CLI / MCP server install in one line. Android & iOS clients ship as APK / IPA on GitHub Releases.
# macOS / Linux — one-line installer (creates a hermetic venv, drops launchers in ~/.local/bin)
$ curl -fsSL https://raw.githubusercontent.com/gclinian/SafeDrop/main/scripts/install.sh | bash
# Windows (PowerShell)
PS> iwr -useb https://raw.githubusercontent.com/gclinian/SafeDrop/main/scripts/install.ps1 | iex
# now on every platform:
$ safedrop-gui # desktop GUI (needs tkinter)
$ safedrop ls # headless CLI
$ safedrop send-text macbook "hello from the terminal"
# expose as MCP tools to Claude Code
$ claude mcp add safedrop -- $(which safedrop-mcp)
# headless LLM bot reachable on the LAN (v1.4)
$ ANTHROPIC_API_KEY=... safedrop-agent --name-suffix agent
# cross-LAN discovery without a relay (v1.7)
$ safedrop tailscale list
$ safedrop-beacon --bind 0.0.0.0:47900 --secret $(openssl rand -hex 16)
Prefer not piping a script into your shell? See the manual install — same result in three steps.
All five clients implement the same wire protocol byte-for-byte.
| Capability | Python desktop GUI | Python CLI / MCP | Android (Kotlin) | iOS (Swift) |
|---|---|---|---|---|
| File transfer | ✓ | ✓ | ✓ | ✓ (send only) |
| Clipboard / text | ✓ | ✓ | ✓ | ✓ |
| Trust / Allow-Deny dialog | ✓ | allow-all (headless) | ✓ | ✓ |
| take_photo peer tool | – | – | ✓ | ✓ |
| show_notification peer tool | tkinter banner | bus only | NotificationManager | UNUserNotificationCenter |
| Token UI | ✓ | CLI | (cross-device) | cross-device |
| MCP stdio / HTTP server | – | ✓ | – | – |
| Multi-agent mesh (agent_bus) | – | ✓ | – | – |
No magic — just well-understood primitives composed carefully.
UDP HELLOs on the LAN carry the device's X25519 pubkey and TCP port. Anyone on the same LAN sees them. That's fine — pairing happens at TCP-time.
HKDF-SHA256 derives the symmetric key from the X25519 shared secret. The 4-digit pair code is derived from the same secret so both sides can verify the link out-of-band.
Allow / Deny dialog on first use; "Always allow" persists to ~/.safedrop/trust.json. HTTP transport adds bearer-token auth with fnmatch-glob scopes.
SafeDrop is at v1.5+ with all roadmap items through v1.7 shipped (sans deferred WebRTC).
| Version | Status | Highlights |
|---|---|---|
| v1.0 – v1.3 | ✓ shipped | LAN transfer, MCP server, iOS Phase 1, HTTP transport, MCP bridge, register_local_tool, trust UI. |
| v1.4 | ✓ shipped | safedrop-agent headless Anthropic bot with per-peer convs + slash commands; iOS file picker; launchd / systemd units. |
| v1.5 | ✓ shipped | Multi-agent mesh: agent_id.json, send_message, recv_messages, list_agents; iOS take_photo. |
| v1.6 | ✓ shipped | Continuity primitives: tokens UI, state handoff, notification mirroring (native rendering on all platforms). |
| v1.7 | ✓ shipped | Opt-in cross-LAN: Tailscale integration + safedrop-beacon discovery service. |
| v2.0 | research | Cross-device input sharing (Logitech Flow-style), Sidecar window streaming, phone-as-webcam, workspace tags. |