The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the MCP Romm listing page.
An MCP server for RomM — the self-hosted retro game library manager. 40 tools: 26 read-only for browsing platforms, searching ROMs, viewing metadata, collections (regular, smart, and virtual), saves, play activity, and tasks — plus 14 write tools for play status, play sessions, favorites, notes, and collection management, through any MCP-compatible AI assistant.
| Tool | Description |
|---|---|
romm_status | Check server configuration and reachability |
romm_stats | Library-wide statistics (platforms, ROMs, saves, total size) |
romm_platforms | List platforms with ROM counts and sizes |
romm_library_items | Browse ROMs with filtering and pagination |
romm_recent | Recently added or updated ROMs |
romm_get_item | Full ROM detail — metadata, saves, user status |
romm_search | Search ROMs by name |
romm_search_by_hash | Identify a ROM by file hash (CRC, MD5, SHA1, or RetroAchievements) |
romm_filters | Available filter values (genres, regions, languages, tags) |
romm_collections | List user-curated collections |
romm_collection_detail | List ROMs in a specific collection |
romm_smart_collections | List auto-generated smart collections |
romm_saves | List save files by ROM or platform |
romm_user_profile | Browse by status (now playing, backlog, completed, etc.) |
romm_rom_notes | View notes on a ROM |
romm_firmware | List BIOS/firmware files per platform |
romm_devices | List registered devices |
romm_tasks | List registered tasks (schedule, manual-run availability) and running status |
romm_scan_library | Trigger a background library rescan (blocked over REST on RomM 5.0 — see Known issues) |
romm_activity | Recent play activity feed — who played what, when (5.0+) |
romm_play_sessions | List recorded play sessions with durations (5.0+) |
romm_virtual_collections | Automatic groupings by genre/franchise/company/etc. (5.0+) |
romm_virtual_collection_detail | List ROMs in a virtual collection (5.0+) |
romm_smart_collection_detail | A smart collection's rules and matching ROMs (5.0+) |
romm_whoami | Authenticated account, role, and effective permissions |
romm_metadata_search | Search metadata providers (IGDB etc.) for ROM matches (5.0+) |
These modify your own user data and collections. They cannot alter ROM files, platforms, firmware, other users, or save files.
| Tool | Description |
|---|---|
romm_set_status | Set play status, backlog, now-playing, rating, completion, last-played |
romm_favorite | Add or remove a ROM from your favorites |
romm_add_note | Add a note to a ROM |
romm_update_note | Edit an existing note |
romm_delete_note | Delete a note (permanent) |
romm_create_collection | Create a new collection |
romm_add_to_collection | Add ROMs to a collection |
romm_remove_from_collection | Remove ROMs from a collection |
romm_delete_collection | Delete a collection — the grouping only, not the ROMs (permanent) |
romm_log_play_session | Record a play session on a ROM (5.0+) |
romm_delete_play_session | Delete one of your play sessions (permanent, 5.0+) |
romm_create_smart_collection | Create a smart collection — a saved filter that auto-matches ROMs (5.0+) |
romm_update_smart_collection | Edit a smart collection's name/description/rules (5.0+) |
romm_delete_smart_collection | Delete a smart collection — the saved filter only (permanent, 5.0+) |
Or clone and install:
Set environment variables:
| Variable | Required | Default | Description |
|---|---|---|---|
ROMM_URL | No | http://localhost:3000 | Your RomM instance URL |
ROMM_USERNAME | Yes | RomM username | |
ROMM_PASSWORD | Yes | RomM password | |
ROMM_REQUEST_TIMEOUT | No | 30 | Default request timeout (seconds) |
ROMM_REQUEST_TIMEOUT_LONG | No | 60 | Timeout for slow endpoints |
ROMM_TLS_VERIFY | No | true | Verify TLS certificates |
ROMM_MCP_TRANSPORT | No | stdio | stdio (client spawns the process) or http (serve remote MCP clients) |
ROMM_MCP_HOST | No | 127.0.0.1 | Bind address for http transport |
ROMM_MCP_PORT | No | 8765 | Port for http transport |
Add to your .mcp.json:
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
By default the server speaks stdio and is spawned by the client. To host it as a shared network service instead — e.g. one instance on your homelab that all your machines use — set:
Then point clients at it, e.g. Claude Code:
The HTTP transport has no authentication of its own — bind it to a trusted network only (LAN, VPN, or an overlay network like Tailscale), never the open internet. Note that claude.ai web/mobile connectors connect from Anthropic's cloud and cannot reach private-network URLs.
Once configured, you can ask your AI assistant things like:
And, with the write tools:
roms.user.write, collections.write, and tasks.run. It deliberately does not request roms.write, platforms.write, firmware.write, assets.write, users.write, or me.write — no tool uses them.romm_delete_note and romm_delete_collection permanently remove data and say so in their descriptions. (romm_delete_collection removes the grouping, not the ROMs.)ROMM_TLS_VERIFY=true).The server uses OAuth2 password grant to authenticate with RomM. Tokens are scoped to the minimum permissions needed and automatically refreshed when they expire. If a request gets a 401, the server re-authenticates and retries once.
Note: The read and write tools operate on your own library and user data, so an ordinary enabled RomM user account is sufficient — admin is not required. (romm_scan_library does require an account permitted to run tasks.)
RomM 5.0 role change: RomM 5.0 collapsed the old viewer/editor/admin roles into user/admin and moved fine-grained authorization to a permissions system (legacy roles are coerced to user on upgrade). If a tool unexpectedly gets a 403 on a 5.0 instance, check the account's effective permissions (GET /api/permissions/me) in the RomM admin UI.
All three are RomM 5.0.0 server-side issues, found by running this server's
live e2e suite (smoke_test.py) against a 5.0.0 instance:
romm_filters times out. GET /api/roms/filters in RomM 5.0.0 executes
a query with a cartesian product (RomM's log flags it at
roms_handler.py:2159); the request hangs until the client timeout, and the
abandoned query keeps running server-side at high CPU. Avoid calling
romm_filters on 5.0.0 until this is fixed upstream — every call strands
another runaway database query.GET /api/roms/{id}/notes fails serialization (UserNoteSchema validation
in endpoints/roms/notes.py) whenever the ROM has at least one note.
Creating and deleting notes work; romm_rom_notes (and the read-back after
romm_add_note) will error until fixed upstream.scan_library as manual_run: false, so POST /api/tasks/run/scan_library
is rejected. romm_scan_library reports this instead of failing; scans run
on the configured schedule or from the web UI.MIT. See CHANGELOG.md for release history.