Copying Nintendo Switch Captures to a Mac: MTP Is a Dead End, Use the microSD¶
Overview¶
Connecting a Nintendo Switch (or Switch 2) to a Mac to pull screenshots and video clips looks like it should work over USB — the console offers System Settings → Data Management → Manage Screenshots and Videos → Copy to a Computer via USB Connection, and third-party mounters like MacDroid advertise support. In practice this path is a dead end on macOS, and the failures are misleading. The reliable route is to pull the microSD card and read it directly.
This article documents why the USB/MTP path fails and what to do instead.
Symptoms¶
- MacDroid fails to mount with:
Mounting failed with error: "The operation couldn't be completed. Device not configured". - After a replug it may appear to mount, but a Finder copy hangs indefinitely on "Preparing to copy…" — even for a single file, and even a plain copy (not a move).
- Image Capture sees the Switch in its sidebar but shows an empty file list (no thumbnails), so you can't import anything.
Root cause¶
The Switch presents itself as a PTP/MTP still-image device. On macOS this collides with the built-in Image Capture stack, and there is no way around it from user space:
- macOS auto-claims the device. The Image Capture Device Daemon
icdd(andptpcamerad) attaches to any PTP still-image interface the moment it enumerates. That is what makes Image Capture list the device — but Image Capture cannot traverse the Switch's MTP folder hierarchy, so it returns an empty list. - libusb / libmtp can't take the interface back. Because a kernel driver is bound to the interface,
libmtp(and anything onlibusb) fails to claim it: Unlike Linux, macOS libusb cannot detach a kernel driver from an interface, so this is unfixable from user space. - SIP blocks disabling the daemon. You cannot stop
icdd/ptpcameradfor the session:$ launchctl bootout gui/$(id -u)/com.apple.icdd Boot-out failed: 150: Operation not permitted while System Integrity Protection is engagedkillall icddonly works for a split second — launchd respawns it on the next device event and re-grabs the interface before any tool can claim it. A background kill-loop still loses the race.
Net result: Image Capture holds the device but can't read the folders; libmtp can read the folders but can't hold the device. MacDroid sits on top of macOS's File Provider layer and inherits the same deadlock — its wedged mount even spawns duplicate MountProvider extensions that hang every subsequent copy at "Preparing to copy".
The fix — read the microSD directly¶
Switch captures live in a plain Nintendo/Album/ folder on whichever storage they were saved to. Skip USB entirely:
- If captures are in System Memory, first copy them to the card on the console: Data Management → Manage Screenshots and Videos → System Memory → Copy All to microSD Card. (Skip if they already save to the card.)
- Power off the console, eject the microSD, and put it in a Mac SD reader (with a microSD adapter).
- The card mounts as a normal exFAT volume. Captures are under:
- Drag the files off. Copy only — never move, rename, or restructure the
Nintendofolder; the console expects its own layout. Leave the originals in place, then delete them from the console (or after a verified copy) if you want the space back.
Switch 2 note: Switch 2 uses microSD Express cards. A standard UHS-I reader still reads them in normal mode — fine for copying captures, just not at Express speeds.
Capture filename format¶
Each capture is named:
<16-digit timestamp>-<32-char uppercase hex game ID>.jpg # screenshot
<16-digit timestamp>-<32-char uppercase hex game ID>.mp4 # video clip
2026041720461800-BEFDE7D710248F377DF6BE3F5120B939.jpg
- The timestamp is
YYYYMMDDHHMMSSnn(local console time). - The 32-hex game ID is a per-title hash — the reliable way to group captures by game. It is not a human-readable name; identify each game from a sample screenshot (or a community game-ID database).
- Some 1080p screenshots carry a trailing
Lbefore the extension (e.g.…B70CC718L.jpg).
Organizing by game (example)¶
Screenshots → ~/Pictures/<Game>/, videos → ~/Movies/<Game>/, grouped by the hex ID:
import os, re, shutil
pat = re.compile(r'-([0-9A-Fa-f]{32})') # extract game ID
games = {"BEFDE7D710248F377DF6BE3F5120B939": "Tomodachi Life - Living the Dream", ...}
for root, _, files in os.walk(ALBUM):
for f in files:
if f.startswith('._'): # skip macOS AppleDouble junk
continue
ext = f.lower().rsplit('.', 1)[-1]
if ext not in ('jpg', 'mp4'):
continue
gid = pat.search(f).group(1).upper()
base = "Pictures" if ext == "jpg" else "Movies"
dst = os.path.join(os.path.expanduser("~"), base, games[gid])
os.makedirs(dst, exist_ok=True)
shutil.copy2(os.path.join(root, f), os.path.join(dst, f))
Gotchas¶
- Screenshot resolution reflects the output mode at capture time, not the game. Docked → up to 1080p; handheld/tabletop → the screen's resolution. A 720p screenshot from a Switch 2 exclusive just means it was captured in handheld mode — it does not mean the file is mislabeled. Use the game-ID hash, not the pixel count, to identify a title.
._AppleDouble files appear alongside real files on exFAT once macOS touches the card — filter them out (! -name '._*') in any count or copy.- Verify before deleting. If clearing the card after a copy, byte-verify every file against its Mac copy first (
filecmp.cmp(..., shallow=False)) and abort on any mismatch. Clearing captures does not free much space if games are installed to the card — that storage is game data, not captures.
Diagnostic reference¶
Confirm what macOS actually sees on the USB bus:
ioreg -p IOUSB -l -w 0 | grep -iE '"USB Product Name"|"USB Vendor Name"' # device present?
system_profiler SPUSBDataType | grep -iA10 nintendo # interface configured?
pgrep -fl icdd # the daemon holding it
brew install libmtp && mtp-detect # VID=057e / PID=2061 = Switch 2
ioreg but not in system_profiler's data list, with no child IOUSBHostInterface, is enumerated-but-unconfigured — exactly the "Device not configured" state.