mcpField
D
doom-mcp

doom-mcp

ローカル
github.com/gunnargroschゲーム・エンタメ1333 週間前に更新

doom-mcp について

doom-mcpはDOOMエンジンを組み込んだRust製MCPサーバーで、Claude CodeやCursorなどのクライアント内でAIコーディングエージェントがプレイできます。各ツール呼び出しでゲーム状態、視認できる敵の情報、画面サムネイルを返します。

主な機能

  1. 01DOOMの開始と再起動
  2. 02移動、戦闘、操作の制御
  3. 03体力、弾薬、敵情報の取得
  4. 04ゲーム画面サムネイルの生成
  5. 05高解像度スクリーンショットの保存

活用シーン

  1. 01AIに指示しながら段階的にレベルを進行
  2. 02AIの自律的な探索や戦闘を観察
  3. 03エピソード、マップ、難易度の指定
  4. 04カスタムWADファイルの利用

MCP 対応

ゲーム開始、アクション実行、スクリーンショット取得のMCPツールを提供します。クライアントから一手ずつ操作する方法と、AIに自律プレイさせる方法があり、STDIOで接続します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"gunnargrosch-doom": {
"command": "npx",
"args": [
"-y",
"doom-mcp"
]
}
}
}
起動コマンドnpx -y doom-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmdoom-mcp0.1.3

ツール

3

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
mapintegerいいえマップ(1-9)
skillintegerいいえ難易度:1=baby、2=easy、3=medium、4=hard、5=nightmare
widthintegerいいえANSI レンダリング幅(列数、デフォルト:100)
episodeintegerいいえエピソード(1-4)

詳細

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?

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


目次


仕組み

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

  1. ゲーム状態 - HP、アーマー、弾薬、キル数、位置、現在の武器
  2. 敵の情報 - 視界内の敵と、人が読みやすい方向、距離、HP
  3. 近くのアイテム - 拾える範囲にある体力、弾薬、アーマー、武器
  4. ドアとスイッチ - 範囲内で検出された操作可能なライン定義
  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 を開始または再起動します。いつでも安全に呼び出せます。すでにゲームが実行中の場合は、新しいセッションを開始せずに正常に再起動します。

パラメーター型デフォルト説明
skillint (1-5)3難易度:1=baby、2=easy、3=medium、4=hard、5=nightmare
episodeint (1-4)1エピソード番号
mapint (1-9)1マップ番号
doom_action

ゲームを進めます。指定されたすべてのアクションは、ティック数の間同時に実行されます。

パラメーター型必須説明
actionsstringyesカンマ区切り:forward、backward、turn_left、turn_right、strafe_left、strafe_right、fire、use、run、1-7
ticksint (1-105)no進めるゲームのティック数。デフォルトは 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_DEBUG1 に設定すると、システムの一時ディレクトリにある 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 よりもレベルの品質に優れています。詳しくは[設定](#configuration)セクションをご覧ください。

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

AI は DOOM を実際にうまくプレイできますか? レベルの移動、敵の発見、照準、戦闘ができます。中程度の難易度では、E1M1 の 1 セッションあたり約 5~10 体を倒します。一部が遮蔽物に隠れた敵への対応や、複雑なドアの連続した移動は苦手です。指示を与えると上達します。

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

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

マルチプレイヤーに対応していますか? まだ対応していません。DOOM のマルチプレイヤープロトコルは、理論上は複数のエージェントによるプレイに対応できますが、実装されていません。

AI は不正をしていますか?壁越しに見えますか? いいえ。敵の検出には DOOM 標準の視線チェック(P_CheckSight)を使用します。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

公開します(CI には npm アカウントと NPM_TOKEN が必要です)。

cd npm && npm publish

クレジット

  • doomgeneric — ozkl によるポータブル DOOM エンジン
  • Freedoom — オープンソースの IWAD ファイル
  • id Software — オリジナルの DOOM(GPL-2.0)

変更履歴

変更内容の詳細な一覧は CHANGELOG.md をご覧ください。

ライセンス

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

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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。