Skip to main content
Glama

{"type": "text"}# MCP 経由のDOOM

MCP Registry npm version npm downloads License: MIT

DOOMは動くのか? 動きます。あなたのAIコーディングアシスタントはDOOMをプレイできます。

Claude Code、Cursor、またはMCP互換のクライアントでDOOMをプレイできます。AIはゲームを見て、悪魔と戦い、レベルを進み、何が起きているかを報告します。あるいは、あなたが一手ずつ指示を出すこともできます。

> 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?

詳細はブログ記事をご覧ください。


目次


Related MCP server: local-agent-context

仕組み

Rust製のMCPサーバーが、実際のDOOMエンジン(doomgeneric)をFFI経由で直接組み込んでいます。エミュレーションも子プロセスもありません。各ツール呼び出しは、ゲームを指定したティック数だけ進め、以下を返します:

  1. ゲーム状態 - HP、アーマー、弾薬、キル数、位置、現在の武器

  2. 敵情報 - 視認可能な敵と、人間が読める方向・距離・HP

  3. 近くのアイテム - 取得範囲内の回復、弾薬、アーマー、武器

  4. ドアとスイッチ - 範囲内で検出された操作可能なlinedef

  5. フレーム画像 - AIの視覚用の小さなPNGサムネイル

AIはこの情報を使って移動、戦闘、探索を行います。あなたが指示することも、自律的にプレイさせることもできます。

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

クイックスタート

1. MCPクライアントに登録する

Claude Code:

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

Cursor、Windsurf、またはその他のMCPクライアント - .mcp.jsonに追加:

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

2. プレイする

新しいセッションを開いて、次のように言います:

「DOOMをやろう」

AIがプレイモードを尋ね、E1M1でゲームを開始し、プレイを始めます。


プレイモード

モード

仕組み

最適な用途

あなたが指示

あなたがコマンドを出します(「前進」「そのドアを開けて」「インプを撃って」)。AIは一度に1つのアクションを実行し、何が起きたかを説明します。

没入型ガイドプレイ

AI自律プレイ

AIがすべての判断を行います(移動、戦闘、探索)。あなたは見守り、必要に応じて介入します。

AIのプレイを見る


ツールリファレンス

doom_start

DOOMを開始または再起動します。いつ呼び出しても安全です。ゲームがすでに実行中の場合は、新しいセッションを必要とせずにクリーンに再起動します。

パラメータ

型

デフォルト

説明

skill

int (1-5)

3

難易度:1=ベビー、2=イージー、3=ミディアム、4=ハード、5=ナイトメア

episode

int (1-4)

1

エピソード番号

map

int (1-9)

1

マップ番号

doom_action

ゲームを進めます。リストされたすべてのアクションは、ティック時間の間同時に保持されます。

パラメータ

型

必須

説明

actions

string

はい

カンマ区切り:forward、backward、turn_left、turn_right、strafe_left、strafe_right、fire、use、run、1-7

ticks

int (1-105)

いいえ

進めるゲームティック数。デフォルト7。35ティック/秒の場合:7 ~ 0.2秒、35 ~ 1秒

ゲームプレイの注意点:

  • fireは全時間トリガーを引き続けます。ピストルは約10ティックごとに自動発射します。

  • 旋回と発射は別々のアクションにすべきです(旋回しながらの発射は弾薬の無駄です)。

  • useはドアを開け、スイッチを作動させます。

  • 武器キー:1=素手、2=ピストル、3=ショットガン、4=チェインガン、5=ロケットランチャー、6=プラズマ、7=BFG。

doom_screenshot

フル解像度の320x200スクリーンショットをシステムの一時ディレクトリに保存し、デフォルトの画像ビューアで開きます。ゲームは進めません(フレームが落ち着くための短い一時停止のみ)。


設定

環境変数

説明

DOOM_WAD_PATH

カスタムIWADファイルへのパス(例:自分専用のDOOM.WADやDOOM2.WAD)

DOOM_MCP_DEBUG

1に設定すると、システムの一時ディレクトリ内のdoom-mcp.logにデバッグログを出力します

同梱のFreedoom WADはそのまま動作しますが、オリジナルのDOOMシェアウェアWADの方がレベルとスプライトが優れています。これを使用するには:

  1. doomworld.com/classicdoom/info/shareware.phpからDOOM1.WADをダウンロードします(合法的、無料)

  2. MCP設定でDOOM_WAD_PATHを設定します:

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

DOOMまたはDOOM 2をお持ちの場合は、同じ方法でそれらのWADを使用できます。任意のカスタムWADを使用するには:

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

FAQ

Windowsでも動作しますか? はい。npmパッケージにはWindows x64バイナリが含まれています。macOS/Linuxと同じ方法で登録してください。

自分のDOOM WAD(DOOM.WAD、DOOM2.WAD)を使用できますか? はい。MCP設定でDOOM_WAD_PATHを設定してください。シェアウェアのDOOM1.WADはdoomworld.comから無料でダウンロードでき、同梱のFreedoomよりもはるかに優れたレベルを持っています。詳細は設定セクションを参照してください。

APIトークンはどれくらい消費しますか? 各doom_action呼び出しは、約1〜2KBのテキスト(ゲーム状態+敵情報)と約6KBのPNGサムネイルを返します。アクションあたり約1,500〜2,500トークンです。50アクションの一般的なゲームプレイセッションでは、約75,000〜125,000トークンを使用します。

AIは実際にDOOMをうまくプレイできますか? レベルを移動し、敵を見つけ、照準を合わせ、戦うことができます。E1M1のミディアム難易度で、セッションあたり約5〜10キルを達成します。部分的な遮蔽物の背後にいる敵や、複雑なドアの連続操作には苦労します。あなたが指示すると上達します。

特定のレベルをプレイできますか? はい。doom_startにepisodeとmapパラメータを渡してください。例えば、エピソード1マップ3の場合はepisode:1, map:3となります。

死んだらどうなりますか? エンジンはHP:0を報告し、デス画面のスクリーンショットを提供します。現在、セッション内での再起動はありません。再度プレイするには新しい会話を開始してください。

マルチプレイヤーはサポートされていますか? まだです。DOOMのマルチプレイヤープロトコルは理論上マルチエージェントプレイをサポートできますが、実装されていません。

AIはズルをしていますか?壁越しに見えたりしませんか? いいえ。敵の検出にはDOOMのネイティブな視線チェック(P_CheckSight)を使用しています。AIは画面上で見えるはずの敵だけを認識します。アイテムは近接で検出されますが、AIはそれらを拾うために実際にその上を歩く必要があります。


アーキテクチャ

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

バイナリはコンパイル時にdoomgeneric Cエンジンをリンクしています。実行時は単一プロセスで、サブプロセスの生成はありません。フレームは共有スクリーンバッファから読み取られ、キー入力はFFIを通じて注入されます。

仮想時間 - エンジンのクロックは実時間から切り離されています。各doomgeneric_Tick()は、実際の経過時間に関係なく、正確に1ゲームティック(1/35秒)進めます。これによりゲームプレイは決定的になり、ティックのスキップが防止されます。

敵とアイテムの検出 - サーバーはエンジンの内部オブジェクトリスト(thinker_tチェーン)を反復処理して、近くの敵と取得可能なアイテムを見つけます。視線チェックにはDoomのネイティブなP_CheckSight()を使用します。視認可能な敵のみが報告され、「壁抜け」チートを防ぎます。


開発

必要なもの: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

テスト用にローカルビルドを登録:

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

デバッグログを有効にする:

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)

npmパッケージ

npmパッケージをローカルでビルド:

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

公開(npmアカウントとCI用のNPM_TOKENが必要):

cd npm && npm publish

クレジット

  • doomgeneric by ozkl - ポータブルDOOMエンジン

  • Freedoom - オープンソースのIWADファイル

  • id Software - オリジナルのDOOM(GPL-2.0)


変更履歴

変更の詳細なリストはCHANGELOG.mdを参照してください。

ライセンス

このリポジトリのMCPサーバーコードはMITライセンスです。

doomgenericはGPL-2.0ライセンスで、ビルド時にクローンされます(ベンダリングはされていません)。Freedoom WADはBSDスタイルのライセンスで配布されています。

Related MCP Connectors

Related MCP Servers