ai-remote
Planned target for use as a mobile controller device for remote access and control of paired hosts.
Allows iOS devices to serve as native mobile controllers for paired hosts, enabling viewing, interaction, and agent control via SwiftUI.
Planned target for use as either a remote host or a desktop controller for remote access and control.
Provides remote control and viewing capabilities for macOS hosts, supporting native Apple Silicon pairing, ScreenCaptureKit, VideoToolbox, and utilizing Accessibility APIs for screen interaction.
ai-remote
AI-native remote control across your devices, over encrypted P2P. Your phone, your tablet, your Mac, your PC — and your AI agent, connected through one shared control layer. Use the human apps to view and control your paired computers, or connect your existing MCP agent to do the work. Watch the screen, take over, and hand control back whenever you want.
Mac + Windows implemented · iOS / iPhone WIP · iPadOS / iPad WIP · Android WIP · Linux WIP
Across your devices
Platform | Role | Status |
macOS / Mac | Host + desktop controller | Implemented; local Apple Silicon pairing, capture, input and H.264 stream acceptance. Mac setup |
Windows / PC | Host + desktop controller | Implemented; Windows UIA and native input paths. Operations · Structured UI evidence |
iOS / iPhone | Native mobile controller | WIP — SwiftUI/UniFFI source, device/simulator SDK builds and simulator UI tests; physical remote-control acceptance pending. Validation |
iPadOS / iPad | Tablet controller | WIP — the iOS app targets iPhone and iPad; iPad layout and real-device acceptance pending. Source and builds |
Android | Phone / tablet controller | WIP — planned; native app implementation pending. |
Linux | Desktop host / controller | WIP — desktop support and platform acceptance pending. |
Mobile devices are controllers for your computers. The project does not currently host a remotely controlled iPhone, iPad or Android device. Linux is a development target, not a supported desktop today.
Pre-alpha; build from source. No signed release or App Store app is available. Mac acceptance used Apple Silicon and macOS 27; Intel Macs and older systems need runtime checks. Platform implementation, SDK builds and simulator tests have different validation scopes. See Mac evidence, Windows/Mac UI evidence and iPhone validation.
Related MCP server: rc-mcp
Paired devices, connected over P2P
Computer to computer. Phone or tablet to computer. Your agent to your paired hosts. The desktop apps, experimental iOS controller and MCP bridge share the Rust controller and encrypted QUIC transport. Pair by device identity, then reach the computers you trust — whether you drive them yourself or hand the tools to your agent.
P2P first. NAT hole punching attempts a direct device-to-device path. If a direct path is unavailable, an encrypted relay carries the traffic; it sees ciphertext.
Pair once, keep trust. One-time tickets and a matching safety code establish device identity. A fresh connection reattempts connectivity; pairing does not promise a permanent direct path.
No manual port forwarding or project cloud account in normal setup. Restrictive networks can still prevent a connection. Self-hosted relays can be configured on the host. Transport architecture
AI-native, from protocol to control
Bring the agent you already use: Codex, Claude Code, Cursor, VS Code, or any stdio MCP client. One MCP bridge exposes your paired computers as tools; no ai-remote hosted model is required.
Capability | What your agent can do |
Native MCP | Discover and call remote tools through the local stdio bridge; reach multiple paired hosts from one client configuration. Client setup |
Structured UI | Read native macOS AX / Windows UIA trees and act on elements with |
Computer tools | Capture screens, inspect windows, send mouse/keyboard input, run shell/background jobs and copy files at the permitted access level, from an agent or straight from a terminal ( |
Shared human / agent control | Watch live video and activity. Taking over stops agent control calls; handing back lets the agent resume. Control and approvals |
Extensible integrations | Mount existing local MCP servers with a pinned executable and an explicit tool allowlist. |
The host checks access level, turn, policy and approval before executing tools. You decide which computers the agent can reach and what it can do on each one.
Desktop stream presets request 1080p30, 1080p60 or 4K30 and show actual decoded resolution/frame rate and received bitrate. macOS 13+ uses native ScreenCaptureKit and VideoToolbox hardware encoding (HEVC or H.264 High, the display's refresh rate, up to 8K for HEVC), with software fallback. Measurements and limits separate encoder benchmarks from live remote performance; presets are requested limits, not guaranteed throughput.
Start from source
You need the pinned Rust toolchain (1.95.0). The desktop app also needs Node/npm and the platform's native development tools.
git clone https://github.com/JIA-ss/ai-remote.git
cd ai-remote
cargo install --path crates/ai-remote --lockedOn macOS, build and open a development app with its CLI included:
tools/macos.sh build --debug --bundles app
open target/debug/bundle/macos/ai-remote.appOn the computer to control, run the installed CLI (make sure Cargo’s bin directory is on PATH):
ai-remote host
# In another terminal on that computer (or in the desktop app: This device → Show pair code):
ai-remote pair-code --level controlIt shows a QR code and an eight-digit pair code. Scan the QR code with the iPhone app, or type the digits on the controller computer (the desktop app's Pair a computer page, or the CLI):
ai-remote pair 4821 0937 --name office-pc
ai-remote call system_info --host office-pcCompare the same three-word safety code on both devices. On a Mac host, grant Screen Recording and Accessibility to the actual running executable, restart it, and run ai-remote doctor. A locked or unauthorized desktop must be repaired before capture/input, not worked around. Detailed operations
Connect your agent
In the desktop app, open Settings → Agents, choose your MCP client, then copy its setup. The app supplies the actual executable path and the current pairing profile, including when the CLI lives inside the Mac bundle.
If ai-remote is on PATH, the basic commands are:
# Claude Code, available across your projects
claude mcp add --transport stdio --scope user ai-remote -- ai-remote mcp
# Codex
codex mcp add ai-remote -- ai-remote mcpCursor uses mcpServers JSON in ~/.cursor/mcp.json. VS Code uses servers JSON in its MCP configuration. Codex also supports [mcp_servers.ai-remote] in ~/.codex/config.toml. Paths, quoting and exact examples: MCP client setup.
Then give the agent the working method: skills/ai-remote/SKILL.md tells it how to start a session, look, act, run commands and files, and what levels, approvals, refusals and the owner taking over mean. Copy the folder to ~/.claude/skills/ for Claude Code, or paste it into any other agent's rules.
Your computers, your rules
Level | Allowed tools |
| Screen, window list, system info and permitted read-only integrations |
| Observe plus mouse, keyboard and clipboard |
| Control plus shell, background jobs and files; risky calls ask first |
High-risk steps wait for owner approval. An unanswered request is denied. Every decision and outcome goes to the host's audit log. Revoke/unpair a device to remove its access. On a machine you only drive yourself, bypass (set at that machine: ai-remote bypass on <controller> or the app's device settings) trusts chosen controllers with everything: every tool, no approvals. Bypass
Allowing remotely currently requires Windows Hello. Mac and iPhone controllers can deny; their Touch ID / Face ID signing backends are not implemented. The native host prompt remains an approval path when the host's desktop is usable. Approval design
Questions people ask
Can my iPhone control my computer? That is the purpose of apps/ios: native SwiftUI UI over the shared Rust controller. The source includes pairing, video, touch/text, takeover and activity. Device and arm64 simulator builds pass with the iOS SDK, as do simulator startup, invalid-ticket, background/resume and relaunch tests. Live control on a physical iPhone still needs acceptance.
Can an agent control my iPhone through this app? No. The iOS source is a controller, not an iPhone host.
Do I need port forwarding or an ai-remote cloud account? No manual port-forwarding or project cloud account is part of normal pairing. Network restrictions can still make a peer unreachable; the tool reports that rather than guaranteeing every network works.
Does it include a native accessibility tree or file manager? The core includes native Mac AX and Windows UIA trees and element actions, alongside screenshots, input and windows. See structured UI contracts and acceptance. File transfer remains planned.
Where are the binaries? No signed release is published yet. Build from source; Windows, Intel Mac, iPhone signing and notarization have separate verification needs.
Development and evidence
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
node --test tools/mcp-install.test.mjsMac acceptance · iPhone validation ledger · Tool reference · Security · Contributing
Roadmap
Stage | Next work |
M0–M2 | Continue Windows/Mac acceptance, improve capture performance, complete file/accessibility work and signed packaging |
M3 | Mobile controllers: iOS/iPhone and iPadOS/iPad acceptance, Android implementation; Face ID signing, QR pairing and notifications |
Platform expansion | Linux desktop host/controller support and acceptance |
M4 | Optional self-hosted account/relay services and device sharing |
License
AGPL-3.0. The official project is JIA-ss/ai-remote.
Available Tools
2 toolslist_hostsARead-onlyIdempotent
List the computers paired with this machine, whether each is reachable now, and whether the connection is direct or relayed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds real value beyond that by disclosing that results include live reachability and connection type (direct vs relayed), which tells the agent the call surfaces current network state rather than static configuration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; every clause conveys distinct, actionable information (inventory, reachability, connection mode).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of describing return content and does so for the three key fields. It could go slightly further on output shape (e.g., per-host naming/grouping) or latency, but it is adequate for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The schema is an empty object and the description correctly implies no inputs are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus a precisely scoped resource ('computers paired with this machine'), and it names the returned attributes (reachability, direct vs relayed). It does not explicitly contrast with the sibling use_host, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it (checking paired-device inventory and connectivity), but there is no explicit guidance about when to prefer this over use_host or what to do after obtaining a reachable host. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_hostAIdempotent
Make a host the default for later calls in this session and return its system_info.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Name of a paired host (see list_hosts). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=true, and the description adds genuinely new behavioral context: that the change persists as a session default for subsequent calls, not just this one. It also discloses that system_info is returned, though it says nothing about failure modes for an unknown/unpaired host.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that conveys the action, its persistent scope, and its return value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool this covers the essential behavior: the session-level side effect and that system_info comes back. Return contents are unspecified, but with no output schema a brief hint is a reasonable level of detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the host parameter is documented there with a pointer to list_hosts for valid names. The description adds no further detail on the parameter (e.g., case sensitivity or accepted formats), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (make a host the default) plus the return value, and makes the session-scoped nature of the effect explicit. It does not name list_hosts as the contrasting retrieval tool in the description itself, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'for later calls in this session' implies when this is useful, but there is no explicit when-to-use/when-not guidance or statement of how it relates to list_hosts. Usage must be inferred from the side-effect phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- First observed
list_hosts - First observed
use_host
This server cannot be deployed
TDQS
Scored across 2 tools
The tools are mostly distinct: list_hosts is read-only discovery, while use_host changes session default. There is some overlap because use_host also returns system_info, but the purposes remain separable.
Both tools follow a clear verb_noun snake_case pattern: list_hosts and use_host. The convention is consistent and predictable.
Two tools is too thin for a remote-host management server. A useful surface would likely include commands to connect, execute, inspect, or manage host pairings.
The surface only supports listing hosts and setting a default. There is no way to execute commands on a host, pair/unpair hosts, disconnect, or perform the apparent core remote operations, leaving significant dead ends.
Maintenance
Related MCP Connectors
Securely control paired computers with ReMCP.
Securely control computers you explicitly pair through files, terminals, processes, screenshots, desktop UI/input, clipboard, browser automation, diagnostics, and document tools.
Secure P2P File Transfer, Encrypted Chat & Communication | Decentralized P2P & AES-256-GCM encryption | Zero cloud logs. Zero registration. For humans and autonomous AI agents / MCP servers.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to securely control a remote Windows/Linux PC via MCP and REST, executing shell commands and driving coding-agent CLIs like Claude, Cursor, and Codex.1-
- AlicenseNot gradedqualityAmaintenanceEnables controlling your own Linux desktop machines from any MCP-capable LLM client, with opt-in agent capabilities for shell, filesystem, processes, screenshots, system info, and input injection.1MIT
- AlicenseNot gradedqualityCmaintenanceControl another PC's desktop from Claude Code via MCP — screenshot, mouse, keyboard, SSH, file transfer. For GUI work SSH can't reach on a remote machine; the remote PC approves each connection. Not Remote Control of your own Claude session.MIT
- AlicenseAqualityAmaintenanceLocalBridge MCP is a bridge between an online AI chats and your computer. Most online AI chats can reason, and write code, but they normally cannot touch the local files, terminals, and scripts that make real work happen. This gives a trusted assistant a controlled doorway into a machine you own, so it can inspect files, edit text, search a project, run tests, use Git, and operate a shell.173Apache 2.0