ue5-gameplay-mcp
ue5-gameplay-mcp
MCP-сервер, который играет в запущенные игры Unreal Engine 5. Он принимает ввод с виртуального геймпада, клавиатуры и мыши, а отдаёт скриншоты, строки логов и состояние UMG.
Это не плагин движка, а клиент. Два плагина уже выполняют работу внутри движка, и каждый держит собственный порт. Этот сервер подключается к обоим и предоставляет их как единый интерфейс инструментов.
Плагин | Порт | Предоставляемые возможности |
RemoteConsole2 | 10101 | Ввод геймпада/клавиатуры/мыши через |
RemoteCapturePlugin | 10102 | Захват экрана в JPEG/PNG (работает в PIE и в упакованных сборках), в комплекте |
В оба плагина был добавлен небольшой объём C++ кода для этого сервера. Они остаются независимыми и сохраняют собственные протоколы. Дополнения обратно совместимы, поэтому даже старые клиенты могут общаться с пересобранной игрой:
FImageMeta.SourceSize— размер игрового заднего буфера. Он упакован в область, ранее бывшую зарезервированной, чтобы сохранить размер структуры в 24 байта. Благодаря этому клиент может сопоставлять точки на уменьшенном захвате экрана с пикселями окна.CMD_GET_GAME_STATE(520) иIRemoteGameStateProvider— подробности ниже.
Установка
cd ue5_gameplay_mcp
uv syncТребуется MCP Python SDK v2 (mcp.server.MCPServer).
Related MCP server: VERA MCP Server
Запуск
Сначала запустите игру. В этом проекте Game-таргет в некученном проекте немедленно завершается, поэтому автономная игра запускается из бинарника редактора:
"C:/Program Files/Epic Games/UE_5.8/Engine/Binaries/Win64/UnrealEditor.exe" "<PATH>/MyProject.uproject" -game -windowed -resx=1280 -resy=720 -log -nosplashЗатем зарегистрируйте сервер. Лежащий в корне проекта .mcp.json уже делает это, поэтому Claude Code автоматически подхватывает его. Ручная команда эквивалентна следующей:
claude mcp add ue5-gameplay -- uv run --directory <PATH>/ue5_gameplay_mcp -m ue5_gameplay_mcpСервер подключается лениво, поэтому фактический порядок запуска не важен. Даже если он запущен раньше игры, подключение произойдёт при первом вызове инструмента.
Опционально: --host, --console-port, --capture-port, --format, --quality, --max-size, --grid-step, --transport streamable-http --mcp-port 14102.
Инструменты
Сессия — game_connect, game_status, game_reset_input
Наблюдение — game_observe, game_state, game_log, game_wait_for_log
Действия — game_pad, game_pad_sequence, game_key, game_mouse, game_console, game_time_scale
UMG — game_ui_dump, game_ui_click, game_ui_focus
Как устроен API и почему
Пока агент совершает обход между сервером и собой, проходят секунды, а игра работает на 60 Гц. Поэтому покадровые действия нереалистичны, и приняты следующие соглашения:
Все Endpoint инструменты принимают
durationи выполняют локально последовательность нажатие/удержание/отпускание в темпе, соответствующем соединению. Один раунд передаёт не один кадр, а одно намерение (интент).Инструменты действий по умолчанию выполняют наблюдение.
game_pad(ly=1.0, duration=0.5)продвигает вперёд и возвращает результирующий кадр. Так тратится вдвое меньше раунд-трипов, чем при раздельном действии и подтверждении.game_pad_sequenceсворачивает целую комбинацию в один вызов, когда важнее тайминг ввода, чем подтверждение между отдельными вводами.game_time_scale(0.2)позволяет выиграть время внутри игры, когда требуется точность до мгновения.hold=Trueпродолжает применять ввод между ходами абаложения, чтобы персонаж двигался, пока агент размышляет. Сбрасывается командойgame_reset_input.
Числа, а не пиксели
game_state возвращает уровень, игровое время, паузу/замедление времени, трансформ и скорость пешки игрока, режим перемещения, камеру, а также дистанцию до ближайшего актёра и нормализованную экранную позициюs. Это те же координаты от 0 до 1, которые принимает game_mouse, поэтому цель из отчёта о состоянии можно сразу взять на прицел. Это стоит лишь малую долю обработки изображения и исключает неверное чтение чисел на HUD.
game_observe(state=True) встраивает это в наблюдение, а game_pad(..., state=True) — в действие, поэтому перемещение и подтверждение по-прежнему укладываются в один раунд-трип.
В реальных картах большинство ближайших актёров — фоновые объекты, поэтому в отчёт также включается class_counts — сводка по всем объектам в радиусе. Достаточно прочитать его один раз, а затем отфильтровать с помощью class_filter="Enemy".
Добавление уникальных чисел игры
Встроенному отчёту не требуется игровой код. Чтобы получить в него только данные этого проекта — здоровье, очки, флаги квестов и т.п. — реализуйте IRemoteGameStateProvider на любом актёре (Plugins/RemoteConsole2/Source/RemoteConsole2/RemoteGameState.h) и верните строку с JSON-объектом:
FString AMyGameMode::GetRemoteGameState_Implementation()
{
return FString::Printf( TEXT("{\"score\":%d,\"wave\":%d}"), Score, Wave );
}Это BlueprintNativeEvent, поэтому переопределить можно даже в проекте без C++, только на Blueprint. Все возвращённые значения сохраняются в разделе custom под ключом с именем актёра. Провайдеры собираются независимо от фильтра по дистанции, поэтому скоркипер, размещённый в начале координат, тоже отправляет свой отчёт. Невалидный JSON не отбрасывается, а передаётся как строка, поэтому даже простой отладочный Printf на этапе запуска оказывается полезен.
Три способа взаимодействия с ками (в порядке предпочтительности)
game_ui_dump+game_ui_click— точно и быстро, но распознаёт только виджеты, зарегистрированные через UMG. В играх с кастомным UI на Slate ничего не возвращается, но инструмент сообщает об этом сам, а не зависает.Навигация с помощью панели —
game_pad(buttons=["DOWN"]),game_pad(buttons=["A"]). Работает почти в любой игре.Смотреть и нажимать —
game_observe(grid=True)накладывает размеченную координатную сетку сюземента варий 0–1. Считайте цель с изображения и передайте те же координаты вgame_mouse(x=..., y=...). Он безразличен к разрешению и работает независимо от того, как построен UI.
Условности
Стик следует спецификации UE:
ly=+1— движение вперёд. (В сетевом протоколе ось Y инвертируется, но здесь она снова корректируется, поэтому API инструмента соответствует собственной карте осей игры.)Координаты мыши нормализованы от 0 до 1 с началом координат в левом верхнем углу и переводятся в пиксели через фактический размер заднего буфера игры. Захват сообщает изменённые размеры, поэтому этот размер опрашивается отдельно.
game_observeвозвращает только новые строки лога с момента последнего наблюдения, thereby при длинных сессиях тот же output не отправляет repetedly.
Известные проproblems and недоделанный
Когда игра хостится в бинарнике редактора, консольные команды маршрутэтся через Python.
FGameOnline a.sighty=...Hmm.
Wait I made a weird typo. Need fix.
Let's rewrite that bullet carefully:
Когда игра хостируется бинарником редактора, консольные команды маршрутизируются через Python.
FGameAccessAPI::ExecConsoleCommandдиспетчётся реализациюIConsoleCommandExecutor[0], но, если загружен плагин Python для редактора, этот слот занимает Python, а не Cmd. Поэтому дажеstat fpsвозвращается какSyntaxError. Сервер один раз при первом использовании выполняет проверку и при обнаружении оборачивает команду вunreal.SystemLibrary.execute_console_command. В упакованных сборках исполнителя Python нет, поэтому обход не требуется. Переопределение возможно черезgame_console(via="cmd").Клики по экрану предполагают, что захват полностью заполняет окно игры. Это верно для
-game -windowed. В полноэкранных режимах с letterboxing внутри сообщаемого размера исходникаТакже содержатся чёрные полосы, и сопоставление поедет.game_stateпри каждом выозе traversы все актёры levelа. For обычнй карты это допустимо, но в streaming-style открыт мирах потребуетссясь пространственный запрос вместоTActorIterator.
Тest
uv run test/smoke_test.pyОбщается с игрой напрямую и записывает smoke_*.jpg, чтобы вы могли глазами пров comport захват и наложенную сетку.
uv run test/mcp_client_test.pyЗапускает сервер как настоящий MCP-клиент через stdio и прогоняет/проверяет все инструменты, включая сценарии с ошибками.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityAmaintenanceEnables AI assistants to control Unreal Engine via Remote Control API for game development automation, including asset management, actor control, level editing, animation, physics, visual effects, and cinematics creation through natural language.1336830MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI clients like Claude Code, Cursor, or VS Code to drive the Unreal Editor: execute Python, capture screenshots, tail logs, check status, and run VERA commands.13MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to interact with a running Roblox game client to execute Lua code, inspect scripts, spy on remotes, and more.143216MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Unreal Engine via Remote Control API for actor, asset, level, and editor operations.2215MIT
Related MCP Connectors
Control Unreal Engine to browse assets, import content, and manage levels and sequences. Automate…
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Drive a live Cinevva game session: edit game files, import CC0 assets, preview changes.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/hiroog/ue5_gameplay_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server