Chris Nager built a playable DOOM game that runs directly inside ChatGPT and Claude using the Model Context Protocol. The app launches inline in compatible AI clients and falls back to a browser URL everywhere else. It uses the cloudflare/doom-wasm runtime and Freedoom Phase 1 content, deployed on Netlify under the /doom/* namespace on Nager's site.
MCP servers usually do straightforward work like fetching files or querying databases. They return JSON or Markdown to help the language model answer questions. MCPfinder helps AI agents find and install other MCP servers. Nager's project does something different. It uses MCP's iframe resource type to host a full WebAssembly game runtime with real-time input and rendering. The DOOM canvas runs directly inside the host iframe, not nested inside another browser page. That distinction matters.
Getting there wasn't simple. Nager hit content security policy conflicts, broken WAD path resolution, and iframe embedding restrictions that varied by host. The breakthrough came when he stopped trying to embed a browser page inside the MCP app and instead treated the MCP app as the browser page itself. He cut save/load, screenshots, and persistence adapters to keep things stable. The final version is lean by design: one tool for inline sessions, one tool for fallback URLs, a signed-token flow that works in both places.
This project proves MCP can deliver actual interactive interfaces inside AI clients, moving beyond its typical role as a context pipe for LLMs. But it also exposes the limits. Whether complex apps like this work depends on the host's security tolerance and CSP rules, constraints that simple data-fetching MCP servers never hit. As Nager wrote on his blog, an MCP app is a "real interactive surface with all the same constraints as the web."