MCP-сервер

У эмулятора одна поверхность управления — Json Debug Interface (JDI) — и каждый фронтенд представляет собой тонкий слой над ней. MCP-сервер открывает этот же интерфейс LLM-агенту: клиент запускает эмулятор как свой дочерний процесс, и каждая отладочная команда эмулятора становится инструментом (tool).

Загрузить образ диска, запустить его, прочитать регистры Gekko, поставить точку останова, дизассемблировать, снять дамп основной памяти, посмотреть счётчики железа, сделать скриншот — агент вызывает те же команды, которые набрал бы в консоли отладчика, и получает ответы в виде Json.

Что это

MCP (Model Context Protocol) — это способ, которым агентское приложение (Claude Desktop, Claude Code, IDE, собственный скрипт) пользуется программой как набором инструментов. Сервер этого эмулятора говорит по протоколу через свои stdin/stdout (транспорт «локального сервера»: клиент запускает эмулятор сам, одно JSON-RPC сообщение на строку), а публикуемые инструменты — это команды отладочного интерфейса, описанные теми спецификациями, которые в эмуляторе уже есть.

MCP-клиент  -- stdio -->  pureikyubu --mcp  -->  Json Debug Interface  -->  эмулятор
     |                          |
     |  tools/call "memdump"    +--> окно остаётся открытым и рабочим (оконные сборки)
     +--------------------------+--> окна нет вообще (headless-сборка)
КомандаЧто делает
pureikyubu --mcpЗапускает локальный MCP-сервер. Файл в командной строке загружается и запускается до этого, так что клиент подключается к уже работающей игре.
mcp 1 / mcp 0Включить или выключить сервер на ходу из консоли отладчика; просто mcp сообщает, работает ли он.
McpRequest <json>Весь протокол одной отладочной командой: сообщение на вход, сообщение на выход. Транспорт — лишь переносчик этих ответов.

Подключение клиента

Клиент, который запускает свои серверы как дочерние процессы, настраивается на исполняемый файл и --mcp. Для автономной работы (без окна) предназначена headless-сборка; оконная сборка работает так же — если вы хотите видеть эмулятор и сами им пользоваться.

{
  "mcpServers": {
    "pureikyubu": {
      "command": "C:\\pureikyubu\\pureikyubu_headless.exe",
      "args": ["--mcp"]
    }
  }
}

Ни порта, ни слушающего сокета, ни аутентификации: сервер — дочерний процесс своего клиента, поэтому разговаривать с ним может только тот, кто его запустил. Один клиент за раз.

Инструменты

До загрузки машины публикуется около 150 команд, после — около 170: узлы, относящиеся к эмулируемому железу (Flipper, конвейер GFX, привод диска), появляются, когда файл уже работает. У каждого инструмента есть текст подсказки и справка команды, аргументы из её собственной спецификации и описание того, что она возвращает.

Управление

load, unload, reset, run, stop, IsLoaded, GetLoaded, MountIso, OpenLid, DvdRead, DumpFst.

Отладчик Gekko

r (регистры), regs (дамп в Markdown), b/bc (точки останова), u, GekkoDisasm, syms, NameByAddress, dtlb, nop.

DSP

dregs, dreg, dmem, imem, du (дизассемблер), dbrk, dspjit, dspmbox.

Железо

memdump (основная память в Markdown), ramload, gx (состояние всего конвейера GFX), gxregs, gxtex, gxpixel, gxshot (PNG), hwprofile (профайлер интерфейсов).

tools/call  load       { "args": ["D:\\Isos\\zelda.iso"] }
tools/call  run        {}
tools/call  r          { "args": ["pc"] }
tools/call  qd         {}                       <- очередь отладочных сообщений (вывод `r`)
tools/call  memdump    { "address": "0x80000000", "lines": "16" }
tools/call  gxshot     { "filename": "frame.png" }
tools/call  hwprofile  { "value": "text" }

Аргументы можно называть (по подсказкам команды: <address> <lines>) или передать всей командной строкой в args. Команда, которая только печатает отчёт — а таких в отладчике большинство — не возвращает ничего; её отчёт попадает в очередь отладочных сообщений, которую читает инструмент qd.

Почему сделано именно так

Ничего нового учить не нужно

Сервер не реализует второй интерфейс: он публикует тот, которым уже пользуются отладчик, консоль и фронтенды. Команда, работающая в консоли, работает и как инструмент, а команда, добавленная в эмулятор завтра, появится в списке инструментов сама.

Протокол — это команда

McpRequest принимает одно MCP-сообщение и возвращает ответ сервера, поэтому протокол можно прогнать (и протестировать) вообще без транспорта — а stdio-сервер представляет собой сотню строк чтения поверх этого.

Агент — это клиент, а не пользователь

Неудачная команда возвращается как неудачный инструмент, вместе со справкой по команде, так что модель может исправиться, а сессия продолжается. Ошибкой протокола считается только неизвестное имя инструмента.

Ограничения

Ни HTTP, ни SSE, ни ресурсов, ни промптов, ни сэмплинга: это локальный транспорт спецификации, а инструменты — то, что у эмулятора есть. Команды, завершающие процесс (exit и её синонимы), намеренно не являются инструментами — вызов убил бы сервер посреди собственного ответа; клиент вместо этого закрывает поток, и эмулятор завершается сам. Ответ вызова инструмента ограничен 4 МБ текста: иначе команда вроде FileLoad превратила бы целый бинарный файл в Json и втиснула бы его в контекст модели.

Документация

Wiki: MCP-сервер

Вся страница: протокол на одной странице, как спецификация становится инструментом, что возвращает вызов инструмента и чем сервер не является.

Тесты

testing/mcp_test.cpp: рукопожатие, ошибки протокола, таблица инструментов на собственном узле и на всех спецификациях, которые поставляет эмулятор.

Отладочный интерфейс

wiki/main.md описывает поверхность управления эмулятора и командную строку; сами команды объявлены в src/jdispecs.cpp и перечисляются командой help в консоли отладчика.