retroarch_load_state_slot
Load a game state from a specific numbered slot without altering the active save slot selector.
Instructions
Load state from an explicit numbered slot. Doesn't change the 'current slot' selector (unlike state_slot_plus/minus + load_state_current).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | Save state slot number |
Implementation Reference
- src/retroarch.ts:208-210 (handler)The loadStateSlot method on RetroArchClient — sends the LOAD_STATE_SLOT command via UDP to RetroArch's NCI to load a save state from an explicit numbered slot.
async loadStateSlot(slot: number): Promise<void> { await this.query(`LOAD_STATE_SLOT ${slot}`); } - src/tools.ts:238-238 (handler)The call-tool handler case that routes 'retroarch_load_state_slot' to ra.loadStateSlot(p.slot).
case "retroarch_load_state_slot": await ra.loadStateSlot(p.slot as number); return ok(`Loaded from slot ${p.slot}`); - src/tools.ts:145-155 (schema)The tool registration with inputSchema requiring a 'slot' integer, and description explaining it loads from an explicit slot without changing the current slot selector.
{ name: "retroarch_load_state_slot", description: "Load state from an explicit numbered slot. Doesn't change the 'current slot' selector (unlike state_slot_plus/minus + load_state_current).", inputSchema: { type: "object", required: ["slot"], properties: { slot: { type: "integer", minimum: 0, description: "Save state slot number" }, }, }, }, - src/tools.ts:176-246 (registration)The registerTools function sets up the ListToolsRequestSchema and CallToolRequestSchema handlers on the MCP server, which includes the switch case for retroarch_load_state_slot.
export function registerTools(server: Server, ra: RetroArchClient): void { server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS })); server.setRequestHandler(CallToolRequestSchema, async (req) => { const { name, arguments: args = {} } = req.params; const p = args as Record<string, unknown>; switch (name) { case "retroarch_ping": { const v = await ra.getVersion(); return ok(`OK — RetroArch ${v}`); } case "retroarch_get_status": { const s = await ra.getStatus(); if (s.state === "contentless") return ok("No content loaded"); return ok( `State: ${s.state}\n` + `System: ${s.system}\n` + `Game: ${s.game}\n` + `CRC32: ${s.crc32 ?? "(none reported)"}`, ); } case "retroarch_get_config": { const v = await ra.getConfigParam(p.name as string); return ok(`${p.name} = ${v}`); } case "retroarch_read_memory": { const bytes = await ra.readMemory(p.address as number, p.length as number); const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0").toUpperCase()).join(" "); return ok(`${addrHex(p.address as number)} [${bytes.length} bytes]:\n${hex}`); } case "retroarch_write_memory": { const n = await ra.writeMemory(p.address as number, p.bytes as number[]); return ok(`Wrote ${n} bytes → ${addrHex(p.address as number)}`); } case "retroarch_read_ram": { const bytes = await ra.readRam(p.address as number, p.length as number); const hex = Array.from(bytes).map((b) => b.toString(16).padStart(2, "0").toUpperCase()).join(" "); return ok(`${addrHex(p.address as number)} [${bytes.length} bytes, CHEEVOS]:\n${hex}`); } case "retroarch_write_ram": { await ra.writeRam(p.address as number, p.bytes as number[]); return ok(`Wrote ${(p.bytes as number[]).length} bytes → ${addrHex(p.address as number)} (CHEEVOS, no ack)`); } case "retroarch_pause_toggle": await ra.pauseToggle(); return ok("Pause toggled"); case "retroarch_frame_advance": await ra.frameAdvance(); return ok("Advanced one frame"); case "retroarch_reset": await ra.reset(); return ok("Game reset"); case "retroarch_screenshot": await ra.screenshot(); return ok("Screenshot saved to RetroArch's configured screenshot directory"); case "retroarch_show_message": { await ra.showMessage(p.message as string); return ok(`Showed: ${p.message}`); } case "retroarch_save_state_current": await ra.saveStateCurrent(); return ok("Saved to current slot"); case "retroarch_load_state_current": await ra.loadStateCurrent(); return ok("Loaded from current slot"); case "retroarch_load_state_slot": await ra.loadStateSlot(p.slot as number); return ok(`Loaded from slot ${p.slot}`); case "retroarch_state_slot_plus": await ra.stateSlotPlus(); return ok("Incremented current slot"); case "retroarch_state_slot_minus": await ra.stateSlotMinus(); return ok("Decremented current slot"); default: throw new Error(`Unknown tool: ${name}`); } }); }