Skip to main content
Glama

DOOM a través de MCP

MCP Registry npm version npm downloads License: MIT

¿Puede ejecutar DOOM? Sí: tu asistente de codificación con IA puede ejecutar DOOM.

Juega a DOOM en Claude Code, Cursor o cualquier cliente compatible con MCP. La IA ve el juego, lucha contra demonios, navega por los niveles e informa de lo que ocurre, o tú la diriges movimiento a movimiento.

> Let's play DOOM!

  Starting E1M1 on medium difficulty...

  HP:100 Armor:0 | Pistol (key:2) | Ammo: 50b 0s 0r 0c | Kills:0 | E1M1
  No enemies in sight. Exploring the corridor ahead.

> Go forward and find some enemies

  Sprinting down the hallway... I can see an opening ahead.

  HP:100 Armor:0 | Pistol (key:2) | Ammo: 50b 0s 0r 0c | Kills:0 | E1M1
  ENEMIES IN SIGHT (aim for angle~0 then fire): Imp (HP:60) to your left (turn_left ~9) nearby

  There's an Imp to the left! Turning to face it...

> Shoot it!

  Aimed and firing!

  HP:100 Armor:0 | Pistol (key:2) | Ammo: 47b 0s 0r 0c | Kills:0 | E1M1
  ENEMIES IN SIGHT (aim for angle~0 then fire): Imp (HP:15) AHEAD close

  Hit! The Imp is wounded (HP:15). One more burst should finish it.

  HP:95 Armor:0 | Pistol (key:2) | Ammo: 44b 0s 0r 0c | Kills:1 | E1M1
  ITEMS: Stimpack (+10 HP) slightly to your right (turn_right ~4) point-blank (~3 ticks fwd+run to reach)
  1 kill! Want to see a screenshot?

Lee la entrada de blog para conocer la historia completa.


Tabla de contenidos


Related MCP server: local-agent-context

Cómo funciona

Un servidor MCP en Rust integra el motor real de DOOM (doomgeneric) directamente mediante FFI. Sin emulación, sin procesos secundarios. Cada llamada a una herramienta avanza el juego un número de ticks y devuelve:

  1. Estado del juego - HP, armadura, munición, muertes, posición, arma actual

  2. Información de enemigos - enemigos visibles con dirección, distancia y HP legibles para humanos

  3. Objetos cercanos - salud, munición, armadura, armas dentro del rango de recogida

  4. Puertas e interruptores - linedefs interactuables detectados dentro del rango

  5. Imagen del fotograma - miniatura PNG pequeña para la visión de la IA

La IA usa esta información para navegar, luchar y explorar. Puedes dirigirla o dejarla jugar de forma autónoma.

graph LR
    A[MCP Client] -->|doom_start| B[doom-mcp binary]
    A -->|doom_action| B
    A -->|doom_screenshot| B
    B -->|FFI| C[doomgeneric C engine]
    C -->|frame buffer| B
    B -->|game state + PNG| A

Inicio rápido

1. Regístrate con tu cliente MCP

Claude Code:

claude mcp add doom --scope user -- npx -y doom-mcp

Cursor, Windsurf o cualquier cliente MCP - añade a .mcp.json:

{
  "mcpServers": {
    "doom": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "doom-mcp"]
    }
  }
}

2. Juega

Abre una nueva sesión y di:

"Juguemos a DOOM"

La IA te preguntará qué modo quieres, iniciará el juego en E1M1 y comenzará a jugar.


Modos de juego

Modo

Cómo funciona

Mejor para

Tú diriges

Tú das órdenes ("ve hacia adelante", "abre esa puerta", "dispara al imp"). La IA ejecuta una acción a la vez y describe lo que ocurre.

Juego guiado inmersivo

IA autónoma

La IA toma todas las decisiones: movimiento, combate, exploración. Tú observas e intervienes si es necesario.

Ver jugar a la IA


Referencia de herramientas

doom_start

Inicia o reinicia DOOM. Es seguro llamarlo en cualquier momento: si ya hay un juego en ejecución, se reinicia limpiamente sin necesidad de una nueva sesión.

Parámetro

Tipo

Predeterminado

Descripción

skill

int (1-5)

3

Dificultad: 1=bebé, 2=fácil, 3=medio, 4=difícil, 5=pesadilla

episode

int (1-4)

1

Número de episodio

map

int (1-9)

1

Número de mapa

doom_action

Avanza el juego. Todas las acciones enumeradas se mantienen simultáneamente durante la duración del tick.

Parámetro

Tipo

Obligatorio

Descripción

actions

string

sí

Separadas por comas: forward, backward, turn_left, turn_right, strafe_left, strafe_right, fire, use, run, 1-7

ticks

int (1-105)

no

Ticks de juego a avanzar. Predeterminado 7. A 35 ticks/seg: 7 ~ 0,2 s, 35 ~ 1 s

Notas de juego:

  • fire mantiene el gatillo durante toda la duración. La pistola dispara automáticamente cada ~10 ticks.

  • Girar y disparar deben ser acciones separadas (girar mientras se dispara desperdicia munición).

  • use abre puertas y activa interruptores.

  • Teclas de armas: 1=puños, 2=pistola, 3=escopeta, 4=ametralladora, 5=lanzacohetes, 6=plasma, 7=BFG.

doom_screenshot

Guarda una captura de pantalla de resolución completa de 320x200 en el directorio temporal del sistema y la abre en el visor de imágenes predeterminado. No avanza el juego (más allá de una breve pausa para que el fotograma se asiente).


Configuración

Variable de entorno

Descripción

DOOM_WAD_PATH

Ruta a un archivo IWAD personalizado (por ejemplo, tu propio DOOM.WAD o DOOM2.WAD)

DOOM_MCP_DEBUG

Establécelo a 1 para habilitar el registro de depuración en doom-mcp.log en el directorio temporal del sistema

El WAD de Freedoom incluido funciona sin configuración adicional, pero el WAD shareware original de DOOM tiene mejores niveles y sprites. Para usarlo:

  1. Descarga DOOM1.WAD desde doomworld.com/classicdoom/info/shareware.php (legal, gratuito)

  2. Establece DOOM_WAD_PATH en tu configuración de MCP:

{
  "mcpServers": {
    "doom": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "doom-mcp"],
      "env": {
        "DOOM_WAD_PATH": "/path/to/DOOM1.WAD"
      }
    }
  }
}

Si posees DOOM o DOOM 2, puedes usar esos WAD de la misma manera. Para usar cualquier WAD personalizado:

{
  "mcpServers": {
    "doom": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "doom-mcp"],
      "env": {
        "DOOM_WAD_PATH": "/path/to/DOOM.WAD"
      }
    }
  }
}

Preguntas frecuentes

¿Funciona esto en Windows? Sí. El paquete npm incluye un binario de Windows x64. Regístralo de la misma manera que en macOS/Linux.

¿Puedo usar mi propio WAD de DOOM (DOOM.WAD, DOOM2.WAD)? Sí. Establece DOOM_WAD_PATH en tu configuración de MCP. El DOOM1.WAD shareware se puede descargar gratis desde doomworld.com y tiene niveles mucho mejores que el Freedoom incluido. Consulta la sección Configuración para más detalles.

¿Cuánto cuesta esto en tokens de API? Cada llamada a doom_action devuelve ~1-2 KB de texto (estado del juego + información de enemigos) más una miniatura PNG de ~6 KB. Eso es aproximadamente 1.500-2.500 tokens por acción. Una sesión de juego típica de 50 acciones usa alrededor de 75.000-125.000 tokens.

¿Puede la IA jugar bien a DOOM? Puede navegar por los niveles, encontrar enemigos, apuntar y luchar. Consigue alrededor de 5-10 muertes por sesión en E1M1 con dificultad media. Le cuesta con enemigos detrás de cobertura parcial y navegar secuencias complejas de puertas. Mejora cuando la diriges.

¿Puedo jugar un nivel específico? Sí. Pasa los parámetros episode y map a doom_start. Por ejemplo, el episodio 1 mapa 3 sería episode:1, map:3.

¿Qué ocurre cuando muero? El motor informa de HP:0 y ofrece una captura de pantalla de la pantalla de muerte. Actualmente no hay reinicio dentro de una sesión: inicia una nueva conversación para volver a jugar.

¿Esto admite multijugador? Todavía no. El protocolo multijugador de DOOM podría teóricamente admitir juego multiagente, pero no está implementado.

¿Hace trampa la IA? ¿Puede ver a través de las paredes? No. La detección de enemigos usa la comprobación nativa de línea de visión de DOOM (P_CheckSight). La IA solo ve enemigos que serían visibles en pantalla. Los objetos se detectan por proximidad, pero la IA aún tiene que caminar sobre ellos para recogerlos.


Arquitectura

src/main.rs         MCP JSON-RPC server over stdio
src/doom.rs         Engine FFI wrapper: init, tick, frame capture, state extraction
src/renderer.rs     PNG rendering (216-color palette thumbnails for MCP, full RGB for screenshots)
src/paths.rs        WAD file discovery across platforms
src/log.rs          Debug logging to file
build.rs            Compiles doomgeneric C sources via cc crate (whitelist approach)
csrc/platform.c     DG_ callbacks, virtual time, key injection, enemy/item/door detection

El binario enlaza el motor C de doomgeneric en tiempo de compilación. En tiempo de ejecución es un único proceso sin creación de subprocesos. Los fotogramas se leen de un búfer de pantalla compartido y las entradas de teclado se inyectan mediante FFI.

Tiempo virtual - El reloj del motor está desacoplado del tiempo real. Cada doomgeneric_Tick() avanza exactamente un tic de juego (1/35 de segundo), independientemente del tiempo real transcurrido. Esto hace que el juego sea determinista y evita que se omitan ticks.

Detección de enemigos y objetos - El servidor itera la lista interna de objetos del motor (cadena thinker_t) para encontrar enemigos cercanos y objetos recogibles. Las comprobaciones de línea de visión usan el P_CheckSight() nativo de Doom. Solo se informa de enemigos visibles para evitar trampas de "wallhack".


Desarrollo

Requiere: cadena de herramientas de Rust, GCC, Make, Git, curl, unzip.

git clone https://github.com/gunnargrosch/doom-mcp.git
cd doom-mcp
bash scripts/setup.sh      # clones engines, downloads Freedoom WAD
cargo build --release       # compiles everything into a single binary
cargo test                  # runs unit + integration tests

Registra la compilación local para pruebas:

claude mcp add doom --scope user -- ./target/release/doom-mcp

Habilita el registro de depuración:

claude mcp add doom --scope user -e DOOM_MCP_DEBUG=1 -- ./target/release/doom-mcp
tail -f /tmp/doom-mcp.log   # Linux/macOS (Windows: %TEMP%\doom-mcp.log)

Paquete npm

Compila el paquete npm localmente:

bash scripts/build-npm.sh   # copies binary + WAD into npm/
cd npm && npm pack           # creates doom-mcp-0.1.2.tgz

Publicar (requiere cuenta npm + NPM_TOKEN para CI):

cd npm && npm publish

Créditos


Registro de cambios

Consulta CHANGELOG.md para obtener una lista detallada de cambios.

Licencia

MIT para el código del servidor MCP en este repositorio.

doomgeneric tiene licencia GPL-2.0 y se clona en tiempo de compilación (no se incluye). El WAD de Freedoom se distribuye bajo una licencia de estilo BSD.

Related MCP Connectors

Related MCP Servers