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:
If you're crazy, you can also this this to tell your agent to play games autonomously:
Features
Installing
Download the latest
Releases: https://github.com/TooTallNate/sys-autopilot/releases
Quick examples (REST API)
MCP setup
Point any MCP client at the console:
Or with the OAuth browser-login flow enabled, it's just:
It's fully open source, so feedback, issues, and PRs are welcome. Hope someone finds it useful for their homebrew projects!
Why?
I made this to speed up homebrew development. The typical loop looks like:
curl -T myapp.nro: deploy a fresh build over the networkscreenshot+tap_buttons: navigate to hbmenu and launch itscreenshot/read_file: observe the app and its logs, then iterate
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:sccommand. 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!







