A headless Mac mini in the other room throws up a dialog box, and your coding agent is stuck. You could walk over and click it, or open a KVM session, or SSH in and hope the dialog has a keyboard shortcut. Or you could let the agent take a screenshot, click the button itself, and keep going. That is the core idea behind rdc, a Rust tool that gives AI coding agents direct control over another machine's desktop through Tailscale.

A Single Binary That Acts as Daemon, CLI, and MCP Server

rdc is one executable. It runs as a background daemon on the machine being controlled, as a command-line tool for human operators, and as an MCP server that coding agents like Claude Code can talk to. The same binary handles all three roles.

On the target machine, rdc listens only on its Tailscale address. There are no passwords, tokens, or certificates to manage. It asks the local tailscaled daemon who is calling, then checks that identity against an allowlist you configure. Your Tailscale network is the security boundary.

Each identity in the allowlist can be scoped to specific capabilities: view (screenshots only), input (mouse and keyboard), or clipboard access. Every request and rejection gets written to a JSON-lines audit log. The tool deliberately exposes no shell access. It is a screen-and-input surface only. For commands, use SSH.

How the Agent Talks to a Remote Desktop

The architecture is straightforward. Your laptop runs Claude Code (or any MCP client), which talks to rdc's MCP server. The MCP server on your laptop connects over Tailscale to the rdc daemon on the target machine. The daemon captures screenshots, synthesizes mouse and keyboard input, manages windows, and reads and writes the clipboard.

Every action returns a fresh screenshot, so the agent can verify what happened. When the agent clicks at pixel coordinates from a screenshot it just took, rdc converts those to actual desktop coordinates. This feedback loop means the agent can observe, act, and confirm without any special integration with the target OS.

Setup on the target machine is a config file with an allowlist and a Tailscale policy grant for the relevant port. On the laptop, you register the MCP server in your client's config, pointing it at the target's Tailscale hostname. The included Agent Skill file teaches agents how to use the tools effectively.

Cross-Platform Support With Clear Boundaries

rdc runs on macOS 15+ (Apple silicon), Linux (Wayland and X11), and Windows 11. The support varies by platform. On macOS, it needs Screen Recording and Accessibility permissions. On Linux, Wayland compositors like Hyprland and wlroots have full support with portal or wlr-screencopy capture and wlr virtual input. GNOME and KDE Wayland can capture screenshots but synthetic input is not wired up yet. X11 compiles but is untested. Windows 11 is verified for single display; multi-monitor is implemented but untested.

CI builds and tests all three platforms on every push. Tagged releases attach prebuilt binaries, though they are not code-signed. You can also install from source with cargo install.

Why This Matters for Agent Workflows

The practical use case is specific but common. You have a headless or remote machine that your agent needs to interact with, and something pops up that requires a visual interface. Without rdc, the agent hits a wall. With rdc, it takes a screenshot, identifies the element, clicks it, and continues.

This is not a replacement for SSH or remote shell access. It is a supplement for the cases where a graphical interface is unavoidable. The explicit no-shell design means rdc does not expand the attack surface for command execution. The Tailscale identity check and scoped permissions mean you can give a monitor-bot read-only screenshot access while giving yourself full control.

The project is licensed under GPLv3 and available on GitHub. For anyone running coding agents against remote machines, especially in mixed OS environments, rdc fills a gap that has previously required manual intervention or heavier remote desktop software.