Every agent. Every device.Connected by Connectra.
Connectra is a private outbound bridge for remote MCP. Any MCP client can find your machines, read and edit code inside the folders you allow, and run commands, with approval and rollback on the machine itself.
- Open source, MIT
- No inbound ports
- Approval on the machine
How it works
A remote MCP server that dials out from your machine.
Three parts, one direction. Your machine opens the connection; nothing on it listens for the internet.
- Outbound only
- The desktop opens an authenticated WebSocket to the Worker. No local listener, no inbound tunnel, no public IP.
- Scoped to your login
- The Worker serves
/mcpand keeps one device registry per GitHub login, so a client only ever sees your own machines. - Decided locally
- Each machine's Rust core validates, asks and executes. The Worker routes requests; it never authorizes them.
Limits, from the docs
- inbound ports
- 0
- approval timeout
- 60 s
- per read_file
- 1 MB
- steps per run_steps
- 20
Without / With
Ten machines used to mean ten terminals.
With Connectra it is one conversation, and every machine still makes its own decisions.
Without Connectra
A session per machine, keys on every box, and you do the fan-out by hand.
10 machines · 10 terminals · 10 sets of keys
With Connectra
One MCP connection. The agent finds every device and runs on each one, with approval on the machine.
All 10 machines updated. Agents restarted and reconnected.
1 chat · 1 MCP connection · approval on each machine
Product
Built for agents that do real work on real machines.
Discovery, edits, commands and approvals over one MCP connection, with the machine in charge of every decision.
Fleet
One conversation reaches every machine.
Ask once. The agent calls list_devices, then run_command on each device it needs. Every machine signed in with your GitHub account appears in the same list.
- Structured argv with a working directory. No shell chaining, pipes or expansion.
- Timeouts, bounded arguments and environment, output capped at 500 KB.
run_stepsruns up to 20 commands in order as one bounded workflow.
Found 10 online devices. Running the update on each one.
All 10 machines updated. Agents restarted and reconnected.
Approvals
Sensitive actions wait for you, on that machine.
Mutations and higher-risk commands pause in Connectra Desktop with the exact command, folder and requester. Nothing runs until you decide.
- Deny, Allow once, or Allow for session.
- No answer within 60 seconds fails closed, and so does a closed app.
- Allow once is bound to a single request ID.
Approvals
Sensitive actions wait for you, on that machine.
Mutations and higher-risk commands pause in Connectra Desktop with the exact command, folder and requester. Nothing runs until you decide.
- Deny, Allow once, or Allow for session.
- No answer within 60 seconds fails closed, and so does a closed app.
- Allow once is bound to a single request ID.
- 1Approval neededThe edit pauses on mini-04 with the file, the diff and who asked.
- 2Allow onceOne click approves this request ID, and only this one.
- 3RunningThe patch is applied atomically and a snapshot is saved first.
- 4UndoUndo in Activity restores the file from that snapshot.
1/4 Approval needed · The edit pauses on mini-04 with the file, the diff and who asked.
Recovery
Edits you can preview, fence and undo.
Every edit carries the SHA-256 the agent last read, so a stale write never lands on newer work. Each mutation is snapshotted before it is written.
patch_file,apply_patchandapply_change_setshow a diff in the approval.apply_change_setedits many files atomically: all of them, or none.rollback_to_checkpointpreviews by default and never pretends to undo a command or network call.
[agent]-model = "v3"+model = "latest"+restart_on_update = true queue = "default"Developer runtime
The toolchain you already use, resolved predictably.
Connectra doesn't inherit an interactive shell PATH. It finds Homebrew, Cargo, Bun, Volta, asdf, pyenv, mise, pnpm, NVM, node_modules/.bin and Python virtualenvs, and rejects temporary or world-writable locations.
inspect_execution_environment shows what a device can resolve before anything runs.
{ "path_or_workspace_id": "ws_...", "stop_on_error": true, "steps": [ { "command": "npm", "args": ["test"], "relative_cwd": "cloudflare-remote-mcp" }, { "command": "npm", "args": ["run", "typecheck"], "relative_cwd": "cloudflare-remote-mcp" }, { "command": "cargo", "args": ["test", "-p", "connectra-core", "--lib"], "relative_cwd": "." } ]}- Headless CLI
connectra-clidrives device status, Allowed Roots, workspaces, trust, approvals and operations, with text or JSON output and deterministic exit codes.- Verified updates
- The desktop checks a public release feed and validates the version, HTTPS origin, artifact path and SHA-256 before offering an update.
- Durable results
- Every operation ends with an explicit outcome, and the result is redelivered after a reconnect until the Worker acknowledges it.
MCP tools
A small, explicit tool surface.
Every tool works on a device you own and inside an Allowed Root. Nothing is generic shell access.
| Group | Tools | Behaviour |
|---|---|---|
| Discover |
| Find devices, folders and code. Bounded depth, entries and results; .git, node_modules and build output are skipped. |
| Read |
| UTF-8 text up to 1 MB per file, 1–20 files per call. Git status and patches relative to HEAD or a checkpoint. |
| Change |
| SHA-256 fenced, diff preview, local approval, snapshot and atomic write. |
| Run |
| Structured argv inside an Allowed Root. Timeouts and output caps; shell launchers stay blocked. |
| Long turns |
| Declare a turn budget, poll the time left, and resume from a compact handoff brief. |
Use cases
What it is for.
mini-08 v0.1.73 · the rest v0.1.74
Security model
Cloud requests. Local decides.
Cloudflare and AI clients are never the authorization authority. The Rust core on each machine makes every policy and security decision, and fails closed when in doubt.
What happens to every call
- 1Tenant check
The Worker authenticates the MCP client and routes only to devices registered to the same GitHub login.
- 2Hard validation
Allowed Roots, canonical paths and the sensitive-file list are checked first. Failures are rejected immediately.
PATH_OUTSIDE_ALLOWED_ROOTSENSITIVE_FILE_BLOCKED - 3Local permission engine
Each capability is set to Allow, Ask or Deny. Ask uses an active session grant or prompts on the machine.
USER_DENIED - 4Prompt on the machine
Deny, Allow once or Allow for session. No answer within 60 seconds, or a closed app, fails closed.
APPROVAL_TIMEOUT - 5Execute and record
Approved work runs locally with snapshots and a durable receipt.
Trust modes
Pick how much the machine asks, per scope.
Ask when local policy requires approval.
Automatically approve routine developer work; ask on risk or boundary.
Keep working without operation approval prompts inside this scope. Commands use your normal host environment, and tokens are never injected into child processes.
On Linux only Full Access is available today. Guarded and Approve for Me fail closed with SANDBOX_UNAVAILABLE until a Linux confinement backend exists.
Hard boundaries no approval can override
- Allowed Roots.
- The agent works only inside folders you choose. Everything else stays invisible.
- Path guards.
- Paths are canonicalized; .. traversal and symlink escapes are rejected.
- Sensitive files.
.env,.pem,.key, credential dotfiles, binaries and archives are hard-blocked.- Session grants.
- Kept in memory, scoped to one capability and root, and gone on disconnect or quit.
- SHA-256 fencing.
- Edits carry the expected hash, so a stale write never lands over newer work.
- Safe environment.
- Secret, loader, proxy and credential variables are refused in
run_command.
Limits
| Limit | Value |
|---|---|
read_file size | 1 MB |
read_files per call | 1–20 files |
run_steps per call | 1–20 steps |
run_command arguments | 100 · 8 KiB each |
| Environment entries | 20 · 2 KiB each |
| Command output | 500 KB |
| Approval timeout | 60 s, fail closed |
apply_patch input | 196,608 bytes |
Clients and platforms
Works with the MCP clients you already use.
Connectra is a standard remote MCP server. A client that can add a remote server over Streamable HTTP with OAuth can reach your machines.
Add it to your client
Paste your Worker URL. Each format follows that client's own docs.
- 01Open Customize → Connectors.
- 02Select +, then Add custom connector.
- 03Name it, paste the URL, select Continue through the sign-in settings, then Add and finish GitHub sign-in.
On Team and Enterprise plans an owner adds it under Organization settings → Connectors.
https://YOUR-WORKER/mcpClient menus change between versions, so check the client's docs if a step moved. No partnership or endorsement is implied.
Protocol
- Endpoint
- https://YOUR-WORKER/mcp
- Transport
- Streamable HTTP · legacy SSE at
/sse - Sign-in
- OAuth 2.1 with PKCE, GitHub identity
- Named in the docs
- Claude, Cursor, ChatGPT, web agents
- Test client
- MCP Inspector
Platforms
- macOS
Desktop app with a launchd supervisor
v0.1.75 installer for Apple Silicon
- Windows
Desktop app with a supervisor sidecar
Not in the v0.1.75 release; last installer v0.1.68
- Linux
Headless supervisor and
connectra-cli, sample containerFull Access only; desktop build last shipped in v0.1.68
Docs
Quickstart
From install to the first tool call. Commands are taken from the Connectra README.
- 01Install Connectra Desktop and open it.
- 02Set Remote MCP Worker to your Worker origin. Don't append
/mcp. - 03Sign in with GitHub. The app shows a Device Flow code and opens the verification page.
- 04Add Allowed Roots, ideally project folders rather than your whole home directory, then Connect.
- 05Add the server to your MCP client, finish GitHub OAuth and try a first prompt.
# Server URL to add in your MCP clienthttps://YOUR-WORKER/mcp# Optional: test the connection with MCP Inspector$ npx @modelcontextprotocol/inspector@latest# A first promptUse list_devices. Then call read_file on the onlinedevice for ~/project/README.md and summarize it.- v0.1.75Latest
CLI login and Linux Full Access
connectra-clilogin (GitHub Device Flow) and device connect for headless hosts.- Linux Full Access with process-group ownership; Full Access children can't read bridge tokens.
- Unknown credential backends now fail supervisor start instead of falling back.
- v0.1.74
Client turn clock and reaped capacity
begin_turnandget_turn_statuslet a client declare a turn budget and poll the time left.get_task_handoffreturns a compact resume brief.- Reaped processes free their device slot immediately.
Earlier releases v0.1.72–v0.1.73
- v0.1.73
GitHub device sign-in reliability
- Device Flow polling starts before the browser opens, so a hung browser can't block sign-in.
- Longer Worker timeouts so slow TLS can finish.
- v0.1.72
CLI v1 and retryable terminal outbox
connectra-cli: device status, Allowed Roots, workspaces, trust, approvals and operations, as text or JSON.- Terminal results are retried after transient bridge failures.
01Do I need to open a port or run a tunnel?
02Who decides whether an action runs?
03What happens if I don't answer an approval?
APPROVAL_TIMEOUT. A closed app fails closed too.04Can an approval unlock .env files or folders outside my roots?
.env, .pem, .key and credential files.05Can I undo what an agent changed?
rollback_to_checkpoint can preview or restore tracked changes. It never pretends that a command, dependency install or network call was undone.06Can the agent run shell pipelines?
run_steps instead of cd ... &&, pipes, redirects or shell expansion, so the approval matches exactly what runs.07Does it work on a server without a desktop?
connectra-supervisor and connectra-cli run headless; the repository includes a Linux sample container. On Linux, Full Access is the only mode for now.08Which AI clients work?
Remote AI. Local authority.
Install Connectra on one machine, connect your MCP client and approve the first call.
Open source under the MIT licence. Early and moving fast. v0.1.75.