惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
量子位
L
LINUX DO - 最新话题
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recorded Future
Recorded Future
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
博客园 - 聂微东
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
G
Google Developers Blog
MyScale Blog
MyScale Blog
罗磊的独立博客
Martin Fowler
Martin Fowler
V
Visual Studio Blog
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
H
Hacker News: Front Page
博客园 - Franky
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
AI
AI
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
TaoSecurity Blog
TaoSecurity Blog
O
OpenAI News
Latest news
Latest news
T
Threat Research - Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
LINUX DO - 热门话题
Spread Privacy
Spread Privacy
I
Intezer
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
C
Cybersecurity and Infrastructure Security Agency CISA
P
Palo Alto Networks Blog
A
Arctic Wolf
AWS News Blog
AWS News Blog
S
Schneier on Security
Y
Y Combinator Blog
月光博客
月光博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
DOOM corre dentro de ChatGPT y Claude gracias a MCP apps
lu1tr0n · 2026-04-29 · via DEV Community

Hay una vieja regla en la cultura geek: si una plataforma puede ejecutar código, alguien intentará correr DOOM en ella. Lo hemos visto en calculadoras, refrigeradores, lectores de tarjetas de crédito, podadoras de césped y hasta en pruebas de embarazo. La última frontera, sin embargo, no es un dispositivo físico: es un cliente de inteligencia artificial. El experimento de DOOM en MCP que publicó Chris Nager en abril de 2026 demostró que el shooter de id Software de 1993 puede ejecutarse inline dentro de ChatGPT y Claude usando el protocolo Model Context Protocol (MCP) de Anthropic.

El truco no es solo una broma técnica. Es una de las primeras demostraciones públicas de lo que las MCP apps —aplicaciones de UI interactiva que se renderizan dentro de los hosts de MCP— pueden lograr cuando se las empuja más allá de su uso típico de "búscame algo en mis archivos". Y para los desarrolladores en LATAM que están empezando a construir agentes con Claude, ChatGPT o herramientas como Cursor, este experimento ilumina varias decisiones de arquitectura que importan en serio.

Qué es MCP y por qué este experimento importa

El Model Context Protocol es un estándar abierto que Anthropic lanzó en noviembre de 2024 para que los modelos de lenguaje puedan conectarse de forma uniforme con herramientas, datos y aplicaciones externas. La analogía oficial es "USB-C para LLMs": en lugar de que cada cliente (Claude Desktop, Cursor, Zed, ChatGPT) implemente integraciones a medida, todos hablan el mismo protocolo y los servidores MCP se vuelven plug-and-play.

Hasta hace poco, los servidores MCP devolvían principalmente texto, imágenes o llamadas a herramientas. Las MCP apps son una capa más reciente: vistas de UI interactiva que el host puede renderizar en un iframe controlado, dejando que el servidor MCP "pinte" su propia interfaz dentro del cliente del usuario. Es ahí donde se vuelve interesante el experimento de DOOM en MCP: si un servidor puede renderizar HTML, JavaScript y un canvas inline, entonces puede renderizar literalmente un juego.

💭 Clave: MCP empezó como una forma de exponer herramientas de texto a un modelo. Las MCP apps lo extienden a UI completa. DOOM corriendo dentro de Claude no es el objetivo; es la prueba de que el techo es mucho más alto de lo que parecía.

Cómo funciona DOOM en MCP por dentro

La arquitectura final que describe Chris Nager es deliberadamente austera. Después de iterar varias versiones complejas con persistencia de sesiones, capturas de pantalla y adaptadores de guardado, terminó cortando casi todo. La versión publicada se reduce a tres piezas:

  • Una herramienta MCP llamada create_doom_session que arranca una sesión inline en clientes que soportan MCP apps.- Otra herramienta MCP llamada get_doom_launch_url que devuelve una URL plana, como fallback para clientes que no pueden renderizar UI inline.- Una ruta de navegador en /doom/play que ejecuta el juego con un token firmado pasado en la URL.

El motor de DOOM corre con cloudflare/doom-wasm, que compila el engine original a WebAssembly. Como contenido por defecto se usa Freedoom Phase 1, una alternativa libre a los WAD originales de id Software, lo que mantiene el proyecto redistribuible sin problemas de licencia.
DOOM ejecutándose inline dentro de la interfaz web de Claude.
El detalle más elegante es el token firmado: la URL de lanzamiento contiene un token criptográfico que basta para arrancar el juego, sin que el navegador tenga que hacer round-trips al servidor para mantener estado. Esto importa porque desacopla el servidor MCP del runtime de DOOM. El servidor solo emite el token; el navegador (sea el del usuario, sea un iframe dentro de Claude) ejecuta el juego sin más diálogo con el backend.

El problema real: iframes, CSP y MCP apps

La parte difícil del proyecto no fue compilar DOOM a WebAssembly —ese terreno está más que pisado—. Fue hacer que el mismo código corriera limpiamente en clientes con políticas de seguridad muy distintas. Cada host MCP (Claude Desktop, Claude web, ChatGPT, Codex, etc.) impone reglas diferentes sobre iframes anidados, Content Security Policy y frame-src.

La primera versión de Nager intentaba algo razonable en papel: la MCP app abría un iframe que a su vez embebía la página /doom/play. Funcionó en algunos hosts y reventó en otros, no por culpa del juego sino por las restricciones que ponía el host al contenido enmarcado. La solución fue dejar de tratar la MCP app como un contenedor que envuelve otra página y empezar a tratarla como la página misma: el canvas de DOOM se monta directo dentro del iframe que ya renderiza el host.

flowchart LR
  U["Usuario en Claude/ChatGPT"] --> H["Host MCP"]
  H -->|llama tool| S["Servidor MCP"]
  S -->|firma token| T["Token JWT"]
  T --> A["MCP App iframe"]
  A -->|carga WAD| W["DOOM WASM"]
  W --> C["Canvas inline"]

Enter fullscreen mode Exit fullscreen mode

Eso eliminó toda una clase de bugs: nada de iframes anidados, nada de fallos de frame-src, nada de suposiciones extra de navegación. Es la lección clásica de "cuando tu solución es frágil porque tiene una capa de más, quita la capa".

💡 Tip: Si estás construyendo una MCP app, no asumas que podés embeber tu propia página dentro del iframe del host. Trabajá con el host como si fuera tu navegador y montá el contenido directamente.

WAD paths, blobs y otros dolores

Una de las partes menos glamorosas del proyecto fue resolver de dónde carga el motor sus archivos WAD (los paquetes de assets de DOOM) y archivos de configuración. La app funcionaba en un entorno y luego intentaba cargar el WAD desde el origen equivocado en otro. La causa: el host MCP a veces servía la app desde una URL diferente a la que el código asumía como base.

Nager terminó eliminando el camino de blob preload (donde los assets se cargaban como blobs de JavaScript) y escribió los WAD y config directamente en el sistema de archivos virtual de Emscripten. Menos piezas en movimiento, menos puntos de falla. Un patrón útil cuando trabajás con WebAssembly: cuanto más explícito sea el control de archivos, más predecible el comportamiento entre hosts.

El stack de despliegue: Netlify y un dominio propio

Todo el proyecto vive bajo chrisnager.com/doom/*. La ruta /doom/play sirve el shell del navegador y /doom/mcp expone el servidor MCP. La elección de Netlify implicó adaptar la estructura para que las funciones serverless del servidor MCP convivieran con los assets estáticos del juego sin romper paths.

Para desarrolladores en LATAM que quieran replicar este patrón, el costo es accesible: el plan gratuito de Netlify alcanza para experimentos de este tipo, y el motor de DOOM compilado a WASM pesa unos pocos megabytes. Si quisieras montar algo similar, una versión simplificada se vería así:

# Estructura mínima del proyecto
# Windows / macOS / Linux — funciona igual con Node 20+

npm create vite@latest mi-mcp-doom
cd mi-mcp-doom
npm install @modelcontextprotocol/sdk
npm install

# servidor MCP mínimo en src/server.ts
# (expone create_doom_session y get_doom_launch_url)

netlify deploy --prod

Enter fullscreen mode Exit fullscreen mode

Diagrama conceptual del flujo entre host MCP, servidor y runtime WASM.

Lo que este experimento revela sobre los agentes IA

DOOM en MCP es un meme funcional, pero también es un mensaje claro: los hosts de MCP están dejando de ser ventanas de chat y se están convirtiendo en navegadores embebidos con permisos. Cuando un servidor puede pintar UI interactiva dentro de Claude, las posibilidades dejan de limitarse al texto: dashboards, formularios, editores de código, simuladores, herramientas de visualización 3D y, sí, juegos.

Para equipos en LATAM que están explorando agentes verticales —legaltech, fintech, agro, salud, educación—, la implicación práctica es que la UI ya no tiene que vivir en una app aparte. Un servidor MCP puede entregar la herramienta y la interfaz al mismo cliente, sin que el usuario tenga que abandonar el chat con el agente. Eso simplifica enormemente el modelo mental de despliegue.

⚠️ Ojo: Esto también amplía la superficie de ataque. Una MCP app maliciosa puede renderizar UI engañosa dentro de un cliente confiable. Antes de instalar servidores MCP de terceros, revisá el código y limitá los permisos que el host concede a apps inline.

Por qué la simplificación final fue la mejor decisión

En versiones intermedias el proyecto tenía save/load, reportes de estado, capturas de pantalla, persistencia de sesiones y un flujo de bootstrap verificado en servidor. Nager cortó casi todo. La forma final son tres piezas: una tool inline, una tool fallback, una ruta de navegador.

La moraleja vale para cualquier proyecto con MCP: la complejidad innecesaria se paga en bugs cruzados entre hosts. Cada feature extra multiplica las combinaciones posibles entre versiones de cliente, políticas de iframe y bugs específicos de Codex, Claude o ChatGPT. Mantener la superficie pequeña hace que el proyecto sea estable, divertido y, sobre todo, mantenible.

📖 Resumen en Telegram: Ver resumen

Preguntas frecuentes

¿Qué es exactamente una MCP app?

Una MCP app es una aplicación de UI interactiva que un servidor MCP expone para que el host (Claude Desktop, ChatGPT, etc.) la renderice inline dentro del chat. A diferencia de las herramientas tradicionales que devuelven texto, las MCP apps permiten que el servidor entregue HTML, JavaScript y canvas que se ejecutan dentro del cliente.

¿Funciona DOOM en MCP en cualquier cliente?

No. Funciona inline solo en hosts que soportan MCP apps con UI interactiva, como Claude Desktop, Claude web y versiones recientes de ChatGPT con MCP habilitado. En clientes que no soportan UI inline, la herramienta get_doom_launch_url devuelve una URL para abrir el juego en un navegador externo.

¿Es legal redistribuir DOOM de esta forma?

El experimento usa Freedoom Phase 1, un conjunto de assets libres compatibles con el motor de DOOM. Los WAD originales de id Software son propiedad de Bethesda/Microsoft y no se redistribuyen. El motor en sí está disponible bajo GPL desde 1997, lo que permite portarlo a WebAssembly y otros entornos.

¿Puedo construir mi propia MCP app sin saber WASM?

Sí. Una MCP app puede ser cualquier página HTML/JS estática. WebAssembly se usa solo cuando necesitás portar código nativo (como un motor de juego o una librería en C). Para dashboards, formularios o herramientas de productividad, basta con HTML, CSS y JavaScript moderno.

¿Qué riesgos de seguridad introducen las MCP apps?

Como cualquier código que se ejecuta dentro de un cliente confiable, una MCP app maliciosa puede mostrar UI engañosa, capturar input del usuario o hacer phishing dentro del propio chat. Anthropic y otros hosts aplican CSP estricta y aislamiento por iframe, pero la responsabilidad última de auditar servidores MCP de terceros recae en el usuario.

¿Para qué sirve esto más allá del meme?

El experimento valida que MCP apps pueden entregar interfaces gráficas completas dentro de un cliente de IA. Aplicaciones reales: editores de código embebidos, dashboards de datos en vivo, herramientas de diseño, simuladores educativos y consolas de administración para agentes que operan sobre infraestructura.

Referencias

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.