Real-time collaborative coding via MCP — two developers, one codebase
Project description
LetsWork
Google Docs for AI-assisted coding — real-time collaboration on a local codebase using two independent Claude subscriptions.
What is LetsWork?
LetsWork is an MCP (Model Context Protocol) server that lets two developers work on the same local codebase simultaneously, each using their own Claude. One developer hosts, the other connects — with file-level locking and an approval system to prevent conflicts.
How It Works
- Developer A (Host) runs
letswork startin their project folder - A secure HTTPS tunnel is created automatically via Cloudflare
- A one-time URL + guest token is generated
- Developer A shares the join command with Developer B (Guest)
- Developer B runs
letswork join <url> --token <token>on their machine - Both can now read, write, and list files — with lock protection and approval flow
Quick Start
Install
pip install letswork
Requirements
- Python >= 3.10
- cloudflared installed and available in PATH
- macOS:
brew install cloudflared - Linux: see Cloudflare docs
- Windows: use WSL (Ubuntu) and follow Linux instructions
- macOS:
- Claude Code CLI (
npm install -g @anthropic-ai/claude-code)
Host (Developer A)
cd /path/to/your/project
letswork start
You'll see a session box with a join command — share it with your collaborator:
╔══════════════════════════════════════════════════════════════════════╗
║ 🤝 LetsWork Session Active ║
║ ║
║ Send this command to your collaborator: ║
║ letswork join https://abc123.trycloudflare.com --token a1b2c3d4 ║
║ ║
║ Press Ctrl+C to stop. ║
╚══════════════════════════════════════════════════════════════════════╝
Claude Code opens automatically in a new terminal window, already connected to LetsWork.
Guest (Developer B)
letswork join <URL_FROM_HOST> --token <TOKEN_FROM_HOST>
Claude Code launches automatically with LetsWork MCP connected. No extra steps needed.
Windows users: Run this inside Ubuntu (WSL). Claude Code will launch directly in the same terminal.
MCP Tools Available
| Tool | Description |
|---|---|
list_files |
List files and directories with lock status |
read_file |
Read file contents (1MB limit) |
write_file |
Submit a file change (requires host approval) |
lock_file |
Lock a file for exclusive editing |
unlock_file |
Release a file lock |
get_status |
Show session info, connected users, and active locks |
get_notifications |
Quick summary of what needs attention right now |
get_pending_changes |
View all changes awaiting host approval with diffs |
my_pending_changes |
View your own submitted changes (guest) |
approve_change |
Approve a pending change and write it to disk (host only) |
reject_change |
Reject a pending change (host only) |
force_unlock |
Force-release a stuck file lock (host only) |
set_display_name |
Set your display name for the session (guest only) |
ping |
Verify connection to the host MCP server |
Approval Flow
Guest file writes go through an approval queue — they are not written directly to disk:
- Guest asks Claude to edit a file →
write_filesubmits the change - Host sees a notification:
📝 guest submitted change to server.py (ID: a1b2c3) - Host asks Claude to review:
get_pending_changes - Host approves or rejects:
approve_change a1b2c3/reject_change a1b2c3
Security
- Unguessable tunnel URL (random Cloudflare subdomain)
- Cryptographic secret token (second auth layer)
- All traffic encrypted via HTTPS
- Path traversal prevention (no access outside project root)
- File lock timeout — locks auto-expire after 30 minutes
- No accounts, no signup, no persistent credentials
CLI Commands
| Command | Description |
|---|---|
letswork start [--port PORT] [--debug] |
Start a session (default port: 8000) |
letswork join <URL> --token <TOKEN> |
Join a session as guest |
letswork stop |
Stop instructions (use Ctrl+C in the start terminal) |
letswork status |
Status instructions (use get_status tool in Claude Code) |
Architecture
Developer A's Machine:
[Local Codebase] ← [MCP Server :8000] ← [Cloudflare Tunnel] ← HTTPS URL
↑
Developer B connects here
via stdio proxy + secret token
The guest connects through a stdio proxy (letswork-proxy) rather than directly over HTTP — this avoids Cloudflare SSE reliability issues and gives stable MCP connectivity.
Constraints
- Maximum 2 users per session (Host + Guest)
- Text files only (binary files not supported)
- 1MB file size limit per operation
- File operations only (no shell access for Guest)
- Requires cloudflared on the host machine
License
MIT
Built with the Model Context Protocol.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file letswork-2.0.8.tar.gz.
File metadata
- Download URL: letswork-2.0.8.tar.gz
- Upload date:
- Size: 25.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba3e5686486beb4b2a2f288434d33d4a4606bf469639f8054773d62439a90280
|
|
| MD5 |
6d54d2cee8f80ee795431bf18da8e0b1
|
|
| BLAKE2b-256 |
6b602612bddb0d35870fb2c76a870bd1205e8020ea8dc552e25feca64cd36051
|
File details
Details for the file letswork-2.0.8-py3-none-any.whl.
File metadata
- Download URL: letswork-2.0.8-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f95a5c81dc1b2def7cd664f6a012036881d9ded45943c7c12a33141887bf9ad
|
|
| MD5 |
7da99af1ddfaa772eff2150452431325
|
|
| BLAKE2b-256 |
1eab513d8f6803ed8a7516767f957176639e0bcb246576b9831dcbb12c089374
|