no cloud · no account · LAN direct

SafeDrop

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.

MIT Python 3.10+ Tests passing Platforms MCP

What it does, in one breath

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.

🔒End-to-end encrypted

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.

🌐Zero-config discovery

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.

🤖MCP fabric

Stdio for Claude Code / Cursor / Goose / Cline. HTTP Streamable-MCP with bearer tokens for cloud agents. Bridge other MCP servers under one namespace.

📱5 native clients

Python desktop GUI (tkinter), Kotlin Jetpack Compose Android app, Swift SwiftUI iOS app, headless CLI, MCP server. All speak the same protocol.

🧠Multi-agent mesh

Persistent agent_id per device. send_message / recv_messages / list_agents let agents on different boxes talk to each other autonomously.

🪞Trust + audit

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.

The architecture, in one picture

Same protocol, three native implementations, four MCP tool sources.

┌─────────────────── your LAN ────────────────────┐ macOS desktop iPhone Linux box ┌──────────────┐ ┌────────┐ ┌───────────┐ │ safedrop-mcp │◀───────▶│ iOS │ │ Pi / NUC │ │ + GUI │ ECDH │ app │◀─────▶│ agent │ │ + agent │ AES └────────┘ ECDH └───────────┘ └─────┬────────┘ (4-digit) (TCP 47891) │ stdio / HTTP ▼ Claude Code Cursor / Goose / Cline / Claude Desktop each agent sees a flat tool list: list_devices ← static MCP tools send_file / send_text iphone_a3b1__read_clipboard ← dynamic peer tools iphone_a3b1__take_photo macbook_9f02__write_clipboard bridge.github.create_issue ← bridged MCP servers my_db_query ← register_local_tool send_message / list_agents ← multi-agent mesh tokens_mint / handoff_save / ← v1.6 continuity

30-second install

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.

What's on each platform

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 bannerbus only NotificationManagerUNUserNotificationCenter
Token UI ✓CLI (cross-device)cross-device
MCP stdio / HTTP server –✓ ––
Multi-agent mesh (agent_bus) –✓ ––

The security model, in three lines

No magic — just well-understood primitives composed carefully.

1. Discovery is unauthenticated.

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.

2. Each TCP session ECDH's a fresh Fernet key.

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.

3. Cross-device tool calls go through a per-(peer, tool) trust gate.

Allow / Deny dialog on first use; "Always allow" persists to ~/.safedrop/trust.json. HTTP transport adds bearer-token auth with fnmatch-glob scopes.

Status & what's next

SafeDrop is at v1.5+ with all roadmap items through v1.7 shipped (sans deferred WebRTC).

VersionStatusHighlights
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.0research Cross-device input sharing (Logitech Flow-style), Sidecar window streaming, phone-as-webcam, workspace tags.