Skip to content

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:

  1. macOS auto-claims the device. The Image Capture Device Daemon icdd (and ptpcamerad) 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.
  2. libusb / libmtp can't take the interface back. Because a kernel driver is bound to the interface, libmtp (and anything on libusb) fails to claim it:
    LIBMTP PANIC: Could not init USB on second attempt
    error returned by libusb_claim_interface() = -3   # LIBUSB_ERROR_ACCESS
    
    Unlike Linux, macOS libusb cannot detach a kernel driver from an interface, so this is unfixable from user space.
  3. SIP blocks disabling the daemon. You cannot stop icdd/ptpcamerad for the session:
    $ launchctl bootout gui/$(id -u)/com.apple.icdd
    Boot-out failed: 150: Operation not permitted while System Integrity Protection is engaged
    
    killall icdd only 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:

  1. 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.)
  2. Power off the console, eject the microSD, and put it in a Mac SD reader (with a microSD adapter).
  3. The card mounts as a normal exFAT volume. Captures are under:
    /Volumes/<CARD>/Nintendo/Album/YYYY/MM/DD/
    
  4. Drag the files off. Copy only — never move, rename, or restructure the Nintendo folder; 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
Example: 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 L before 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
A device that shows in ioreg but not in system_profiler's data list, with no child IOUSBHostInterface, is enumerated-but-unconfigured — exactly the "Device not configured" state.

See also