[release] sys-autopilot — Remote-control your Switch over HTTP + MCP (drive it with an AI agent)

tootallnate

Developer
Developer
Joined
Mar 31, 2023
Messages
83
Reaction score
275
Trophies
0
Age
37
Website
n8.io
XP
870
Country
United States
I've been building sys-autopilot, an Atmosphère sysmodule that runs a persistent HTTP server on the console at boot. It exposes a REST API and a native MCP (Model Context Protocol) endpoint for taking screenshots, injecting controller input, and reading/writing files on the SD card. Basically everything you (or an AI agent) need to drive the Switch remotely while testing homebrew.

Why?
I made this to speed up homebrew development. The typical loop looks like:
  1. curl -T myapp.nro: deploy a fresh build over the network
  2. screenshot + tap_buttons: navigate to hbmenu and launch it
  3. screenshot / read_file: observe the app and its logs, then iterate
Because it speaks MCP natively, you can point an AI agent (Claude Code, Cursor, VS Code, etc.) straight at the console and have it test your homebrew for you. It presses buttons, reads screenshots, and tails log files on its own.

If you're crazy, you can also this this to tell your agent to play games autonomously:
Launch Pokemon FireRed until you beat the final four. Make no mistakes.

Features
  • Screenshots: grabs the current screen as JPEG (1280x720) via the native caps:sc command. Over MCP the agent sees the image directly.
  • Controller input: a virtual Pro Controller (HDLS) for taps, holds, button sequences, and analog sticks.
  • File access: read/write/delete/list anything on the SD card. Uploads are streamed straight to disk (no size cap), with SHA-256 hashing to verify they landed intact.
  • Native MCP endpoint at POST /mcp (stateless Streamable HTTP, JSON-RPC 2.0), so no glue code is needed.
  • Optional auth: static bearer token, HTTP Basic, or a full OAuth 2.1 browser-login flow for MCP clients (no manual headers).

Installing
Download the latest sys-autopilot-<version>.zip from the Releases page and extract it to the root of your SD card. Reboot, and the server starts automatically (boot2), listening on port 4150 by default.

Releases: https://github.com/TooTallNate/sys-autopilot/releases

Tip: disable auto-sleep in System Settings while driving the console remotely, since sleep mode drops the network connection.

Quick examples (REST API)
Code:
# Take a screenshot
curl -o screen.jpg http://<switch-ip>:4150/screenshot

# Press a button
curl -X POST http://<switch-ip>:4150/input/tap \
     -H 'Content-Type: application/json' \
     -d '{"buttons":["A"]}'

# Deploy a build
curl -T myapp.nro "http://<switch-ip>:4150/files?path=/switch/myapp.nro"

# Tail a log file
curl "http://<switch-ip>:4150/files?path=/switch/myapp/debug.log&offset=-2048"

MCP setup
Point any MCP client at the console:
Code:
{
  "mcpServers": {
    "switch": {
      "type": "http",
      "url": "http://<switch-ip>:4150/mcp",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}

Or with the OAuth browser-login flow enabled, it's just:
Code:
claude mcp add --transport http switch http://<switch-ip>:4150/mcp

It's fully open source, so feedback, issues, and PRs are welcome. Hope someone finds it useful for their homebrew projects! :)
 
  • Like
Reactions: hippy dave

Site & Scene News

Popular threads in this forum