mm.tech
architecture··4 min

Stdio frente a HTTP para MCP

La elección de transporte lo cambia todo. Latencia, modelo de seguridad, despliegue. Un árbol de decisión práctico.

MCP soporta dos transportes. Stdio (pipes stdin/stdout entre procesos) y HTTP+SSE (server-sent events sobre HTTP). En la spec parecen intercambiables. No lo son.

Stdio: el servidor MCP es un subproceso del agente (Claude Desktop, Claude Code, Cursor). El agente lo lanza, pasa JSON-RPC por stdin/stdout, lo mata al salir. Latencia por debajo del milisegundo. La autenticación es implícita (el usuario ya tiene acceso al proceso). El despliegue es "publica un binario o un paquete npm, el usuario corre npx".

HTTP+SSE: el servidor MCP es un servicio web de larga duración. El agente conecta vía HTTPS, abre un stream SSE, envía requests JSON-RPC por POST. La latencia es la de tu red más el handshake TLS. La autenticación es OAuth 2.1 PKCE o bearer tokens. El despliegue es "aloja el servidor, gestiona el cert, gestiona el auth".

Elige stdio cuando: el usuario ejecuta el agente en local, los datos son locales, no necesitas multi-tenancy, quieres UX zero-config. Elige HTTP cuando: tienes datos multi-tenant en un servidor, necesitas OAuth, quieres exponer el mismo servidor MCP a muchos usuarios, necesitas actualizar el servidor sin que los usuarios actualicen su paquete npm.

Ejemplo real. local-memory-mcp es stdio: el archivo SQLite vive en el disco del usuario, no hace falta servidor, npx y listo. studiomeyer-memory es la versión HTTP de lo mismo: multi-tenant, OAuth, alojado en memory.studiomeyer.io. La interfaz es parecida pero el despliegue es completamente distinto.

La trampa en la que caí: construir solo HTTP cuando stdio habría salido en un día. mcp-personal-suite empezó como HTTP porque pensé "SaaS". Error. La cosa envuelve tu email y tu calendario locales. Tiene que ser local. Lo reescribí como stdio, tiré el scaffolding SaaS, salí dos semanas antes.

Árbol de decisión: ¿los datos son locales al usuario? Stdio. ¿El usuario ejecuta el agente en local? Probablemente stdio. ¿Necesitas actualizar el servidor sin que el usuario haga nada? HTTP. ¿Tienes datos multi-tenant en tus servidores? HTTP. ¿Necesitas ambos? Construye primero la versión stdio, luego la HTTP, comparte la lógica de fondo.