doom-mcp について
doom-mcpはDOOMエンジンを組み込んだRust製MCPサーバーで、Claude CodeやCursorなどのクライアント内でAIコーディングエージェントがプレイできます。各ツール呼び出しでゲーム状態、視認できる敵の情報、画面サムネイルを返します。
主な機能
- 01DOOMの開始と再起動
- 02移動、戦闘、操作の制御
- 03体力、弾薬、敵情報の取得
- 04ゲーム画面サムネイルの生成
- 05高解像度スクリーンショットの保存
活用シーン
- 01AIに指示しながら段階的にレベルを進行
- 02AIの自律的な探索や戦闘を観察
- 03エピソード、マップ、難易度の指定
- 04カスタムWADファイルの利用
MCP 対応
ゲーム開始、アクション実行、スクリーンショット取得のMCPツールを提供します。クライアントから一手ずつ操作する方法と、AIに自律プレイさせる方法があり、STDIOで接続します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
3掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| map | integer | いいえ | マップ(1-9) |
| skill | integer | いいえ | 難易度:1=baby、2=easy、3=medium、4=hard、5=nightmare |
| width | integer | いいえ | ANSI レンダリング幅(列数、デフォルト:100) |
| episode | integer | いいえ | エピソード(1-4) |
詳細
MCP 経由で DOOM
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)を直接組み込みます。エミュレーションも子プロセスもありません。各ツール呼び出しでゲームを指定したティック数だけ進め、次の情報を返します。
- ゲーム状態 - HP、アーマー、弾薬、キル数、位置、現在の武器
- 敵の情報 - 視界内の敵と、人が読みやすい方向、距離、HP
- 近くのアイテム - 拾える範囲にある体力、弾薬、アーマー、武器
- ドアとスイッチ - 範囲内で検出された操作可能なライン定義
- フレーム画像 - 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=baby、2=easy、3=medium、4=hard、5=nightmare |
episode | int (1-4) | 1 | エピソード番号 |
map | int (1-9) | 1 | マップ番号 |
doom_action
ゲームを進めます。指定されたすべてのアクションは、ティック数の間同時に実行されます。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
actions | string | yes | カンマ区切り:forward、backward、turn_left、turn_right、strafe_left、strafe_right、fire、use、run、1-7 |
ticks | int (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_DEBUG | 1 に設定すると、システムの一時ディレクトリにある doom-mcp.log へのデバッグログを有効にします |
同梱の Freedoom WAD はそのまま動作しますが、オリジナルの DOOM シェアウェア WAD のほうが、レベルやスプライトの品質に優れています。使用するには、次の手順を実行します。
- doomworld.com/classicdoom/info/shareware.php から
DOOM1.WADをダウンロードします(合法かつ無料です) - 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 スタイルのライセンスで配布されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。