Tu agente de código lee el repositorio, comprueba la compilación y abre incidencias en tu gestor de tareas. Un diagrama típico de ese montaje muestra una sola caja con la etiqueta «MCP» entre el modelo y las herramientas. Luego un revisor de seguridad pregunta qué proceso puede leer tu directorio personal, qué token llega al gestor de tareas y quién aprobó la llamada que creó una incidencia. La caja no tiene respuesta.
El Model Context Protocol (MCP) tiene una arquitectura precisa, y su revisión 2026-07-28 cambió una parte. Este artículo cubre los participantes, las capas del protocolo, los transportes, las funciones, una llamada a una herramienta, la autorización remota y los límites de confianza, con un diagrama que puedes copiar.
Hosts, clientes y servidores
Antes de MCP, cada aplicación de IA necesitaba su propio adaptador para cada herramienta: cinco aplicaciones y veinte herramientas suponían hasta 100 integraciones. Con MCP, 25 implementaciones (un cliente por aplicación, un servidor por herramienta) cubren todas las combinaciones.
| Participante | Qué es | Qué guarda |
|---|---|---|
| Host | La aplicación de IA: un IDE, una app de chat, un runtime de agentes | La conversación, las llamadas al modelo, el consentimiento del usuario, las credenciales |
| Cliente | Un conector que el host crea para un servidor | Una conexión y las capacidades que declara |
| Servidor | Un programa que expone herramientas, recursos y prompts | Acceso al sistema que encapsula |
Un host crea un cliente por servidor, y cada cliente habla con exactamente un servidor. El modelo nunca llama a un servidor por sí mismo: pide una llamada a una herramienta, y el host decide si la ejecuta y qué cliente la envía. Los servidores permanecen aislados: no deberían ver toda la conversación ni verse entre sí.
Dos capas y qué cambió 2026-07-28
La capa de datos es JSON-RPC 2.0: peticiones (con un id que nunca es nulo), resultados, errores y notificaciones unidireccionales. La capa de transporte mueve esos mensajes y se ocupa del encuadre, la cancelación y la autorización.
La especificación 2026-07-28, publicada el 28 de julio de 2026, hizo que MCP no tuviera estado. Las revisiones anteriores abrían cada conexión con un handshake initialize que fijaba la versión y las capacidades, y los servidores HTTP podían fijar una sesión con Mcp-Session-Id. Ahora cada petición lleva su versión de protocolo y las capacidades del cliente en _meta, de modo que puede llegar a cualquier instancia del servidor detrás de un balanceador de carga round-robin sencillo.
| 2025-11-25 y anteriores | 2026-07-28 | |
|---|---|---|
| Versión y capacidades | initialize una vez por conexión |
_meta en cada petición; server/discover opcional |
| Estado entre llamadas | Cabecera Mcp-Session-Id |
Handles explícitos pasados como argumentos de la herramienta |
| El servidor necesita datos del cliente | El servidor envía su propia petición | InputRequiredResult, y el cliente reintenta |
| Notificaciones de cambios | Flujo HTTP GET | Flujo subscriptions/listen |
| Flujo interrumpido | Reanudar con Last-Event-ID |
Reenviar con un id nuevo |
Los servidores creados con SDK antiguos siguen esperando el handshake, así que los clientes de ambas épocas sondean primero y recurren a initialize. Un cliente que solo habla 2026-07-28 no puede usar un servidor exclusivamente heredado. El registro de cambios enumera cada cambio incompatible.
Transportes: stdio y Streamable HTTP
| stdio | Streamable HTTP | |
|---|---|---|
| El servidor se ejecuta como | Un proceso hijo que lanza el cliente | Un servicio independiente con un único endpoint, como /mcp |
| Mensajes | Un mensaje JSON-RPC por línea en stdin y stdout | Un POST por mensaje; la respuesta es JSON o un flujo SSE limitado a la petición |
| Credenciales | Del entorno | Normalmente un bearer token OAuth 2.1 en cada petición |
| Cancelar una petición | notifications/cancelled |
Cerrar el flujo de respuesta |
| Cabeceras para proxies | Ninguna | MCP-Protocol-Version, Mcp-Method, Mcp-Name |
Streamable HTTP sustituyó al transporte HTTP+SSE (un flujo GET más un endpoint POST aparte) en 2025-03-26; HTTP+SSE está ahora formalmente obsoleto. Las pasarelas pueden enrutar y limitar la tasa según Mcp-Method y Mcp-Name sin analizar los cuerpos, y los servidores rechazan las peticiones cuyas cabeceras contradicen el cuerpo. Los servidores HTTP deben validar la cabecera Origin contra el DNS rebinding, y los locales deberían enlazarse a 127.0.0.1.
Funciones del servidor y del cliente
| Función | Ofrecida por | Quién la dirige | Métodos | Estado |
|---|---|---|---|---|
| Tools | Servidor | El modelo | tools/list, tools/call |
Activa |
| Resources | Servidor | La aplicación | resources/list, resources/read |
Activa |
| Prompts | Servidor | El usuario | prompts/list, prompts/get |
Activa |
| Elicitation | Cliente | El servidor pregunta al usuario | elicitation/create |
Activa |
| Sampling | Cliente | El servidor pregunta al modelo del host | sampling/createMessage |
Obsoleta |
| Roots | Cliente | El servidor pide carpetas | roots/list |
Obsoleta |
El modo de formulario de elicitation nunca debe pedir contraseñas, claves de API ni tokens; el modo URL envía al usuario a una página fuera del cliente. Sampling, roots y el registro de logs del servidor quedaron obsoletos en 2026-07-28 y no pueden eliminarse antes de la primera revisión publicada a partir del 28 de julio de 2027.
Una llamada a una herramienta, paso a paso
El modelo abre una incidencia a través de un servidor remoto:
- Opcionalmente, el cliente llama a
server/discoverpara obtener versiones y capacidades. - El cliente llama a
tools/list. El host fusiona las listas de todos los servidores, antepone un prefijo a los nombres que colisionan y se las entrega al modelo. - El modelo pide
create_issue. El host muestra la llamada y el usuario la aprueba. - El cliente envía
tools/call, que se muestra a continuación. - Si el servidor necesita una confirmación, devuelve
input_requiredcon una solicitud de elicitation. El cliente pregunta al usuario y reintenta con la respuesta y elrequestStateopaco del servidor. - El resultado llega como
complete. Un fallo de la herramienta estableceisError: true, para que el modelo pueda corregirse. - En un flujo
subscriptions/listen,notifications/tools/list_changedindica al cliente que vuelva a listar las herramientas.
POST /mcp HTTP/1.1
Host: mcp.tracker.example
Authorization: Bearer eyJhbGciOi...
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: create_issue
{"jsonrpc": "2.0", "id": 7, "method": "tools/call",
"params": {"name": "create_issue",
"arguments": {"title": "Login fails on Safari"},
"_meta": {"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {"name": "my-ide", "version": "1.4.0"},
"io.modelcontextprotocol/clientCapabilities": {"elicitation": {}}}}}
{"jsonrpc": "2.0", "id": 7, "result": {"resultType": "complete",
"content": [{"type": "text", "text": "Created issue #482"}], "isError": false}}
Servidores remotos y autorización
Un servidor MCP remoto es un servidor de recursos OAuth; sus tokens vienen de un servidor de autorización operado por el mismo proveedor o por un proveedor de identidad aparte. En una primera conexión:
- El cliente llama sin token y recibe
401, normalmente con una cabeceraWWW-Authenticateque apunta a los metadatos del recurso protegido del servidor (RFC 9728). - Ese documento, o
/.well-known/oauth-protected-resourcecomo alternativa, nombra el servidor de autorización, cuyos metadatos lee el cliente; se detiene si no se anuncia PKCE. - El cliente usa un ID de cliente preregistrado, un Client ID Metadata Document (una URL HTTPS como ID de cliente) o el registro dinámico de clientes, que 2026-07-28 declara obsoleto.
- El cliente ejecuta el flujo de código de autorización con PKCE (
S256) y un parámetroresourceque nombra el servidor MCP (RFC 8707). El usuario inicia sesión y da su consentimiento en el navegador, y el cliente comprueba elissde la respuesta (RFC 9207). - Cada petición lleva
Authorization: Bearer. Un403coninsufficient_scopeactiva la autorización escalonada (step-up).
El servidor solo acepta tokens emitidos para él y nunca los reenvía: las llamadas a una API ascendente usan un token distinto. El diagrama del flujo OAuth 2.0 explica PKCE, y la especificación de autorización contiene todas las reglas, basadas en el borrador de OAuth 2.1.
Dónde están los límites de confianza
| Límite | Riesgo | Control |
|---|---|---|
| Modelo y texto de las herramientas | Instrucciones inyectadas en descripciones o resultados; definiciones cambiadas tras la aprobación | Tratarlos como datos no confiables, mostrar las llamadas al usuario, volver a aprobar las definiciones cambiadas |
| Máquina y servidores stdio | Un servidor lee archivos, variables de entorno o claves SSH y los envía fuera | Revisar los paquetes; aislar los servidores de terceros en un sandbox con un único montaje de solo lectura y sin red; un token limitado por servidor |
| Borde de red | Tokens robados o con demasiado alcance | Tokens vinculados a la audiencia y de corta duración; ámbitos mínimos con step-up |
| Entre servidores | Un servidor dirige cómo el agente usa las herramientas de otro | Pocos servidores, nombres de herramientas distintos, mediación del host |
El transporte stdio no es un sandbox: la guía de seguridad de servidores locales de MCP dice que un servidor stdio se ejecuta con los privilegios del cliente, y que el aislamiento depende del host y de quien opera la máquina. Un handle de estado emitido por un servidor sin estado tampoco es una credencial; vincúlalo al usuario autenticado. El diagrama de flujo de datos para modelado de amenazas muestra cómo recorrer esos límites con STRIDE.
El diagrama de arquitectura MCP
Contenido del diagrama
- Developer machine: one OS user, one trust domain
- Host application (IDE or chat app)
- Remote service (vendor cloud)
- Developer
- Agent loop + LLM
- MCP client 1
- MCP client 2
- MCP client 3
- Filesystem server
- Git server
- Issue tracker MCP server
- Issues API
- Authorization server
- prompts, approvals
- read_file
- git_log
- create_issue
- stdin / stdout
- POST /mcp + Bearer token
- OAuth 2.1: browser sign-in, code + PKCE + resource
- own token
Cómo leerlo:
- El marco verde es un dominio de confianza: el host, sus tres clientes y los dos servidores stdio se ejecutan como el usuario del sistema operativo del desarrollador.
- Un cliente por servidor. Los clientes 1 y 2 usan stdin y stdout; el cliente 3 usa Streamable HTTP.
- Las aristas grises desde el modelo son llamadas a herramientas que el host enruta; los servidores nunca llegan directamente al modelo.
- El azul cruza la red con un bearer token. El violeta discontinuo es el flujo OAuth, que solo se ejecuta cuando el cliente no tiene un token válido.
- El verde azulado es el servidor remoto que llama a su API con su propio token: sin reenvío.
- El bloque Markdown resume la revisión 2026-07-28.
Cómo dibujar con claridad diagramas de arquitectura MCP
- Un cliente por servidor. Una sola caja «MCP» oculta lo que puede ver cada servidor.
- Etiqueta las aristas con el transporte y la carga útil: stdin y stdout, un POST con bearer token, un flujo OAuth, nombres de herramientas de ejemplo.
- Dibuja los límites de confianza como marcos: la máquina, el host, cada proveedor. Marca los servidores aislados en un sandbox.
- Da al servidor de autorización y a las API ascendentes sus propios nodos, para que se vean las fuentes de tokens y la regla de no reenvío.
- Indica la revisión del protocolo. Un diagrama de 2026-07-28 no tiene handshake ni IDs de sesión.
- Deja fuera los detalles internos de los SDK, las listas completas de herramientas y la infraestructura del proveedor del modelo.
El diagrama de arquitectura de agentes de IA cubre el bucle del agente alrededor de estas llamadas.
Constrúyelo en Archboard
- Inicia sesión con Google o GitHub y crea un diagrama.
- Añade un Marco del paquete Básico para la máquina del desarrollador y, dentro, un Límite del contenedor del paquete C4 Model para el host.
- En el límite, añade un Modelo del paquete ML y tres nodos Componente del paquete C4 Model para los clientes, con la tecnología stdio, stdio y Streamable HTTP.
- Añade dos nodos Contenedor del paquete C4 Model para los servidores locales, conectados con aristas «stdin / stdout», y una Persona del mismo paquete conectada al modelo.
- Fuera del marco, añade un Límite del sistema del paquete C4 Model que contenga un Contenedor para el servidor remoto, un Sistema externo para su API y un Proveedor de identidad del paquete Seguridad, y luego dibuja las aristas del bearer token, del OAuth discontinuo y de «own token».
- Añade un bloque Markdown del paquete Básico con los datos del protocolo, y notas de Texto de Básico para los límites.
Ninguna herramienta gratuita lee los archivos de configuración de clientes MCP, así que dibuja los servidores tú mismo o pega un diagrama de flujo de Mermaid, como el de la especificación MCP, en la herramienta de Mermaid a diagrama editable.
En el momento de escribir esto (noviembre de 2026), Archboard es en sí mismo un servidor MCP remoto en https://getarchboard.app/mcp: Streamable HTTP, OAuth 2.1 desde su propio servidor de autorización con PKCE (S256) y esa URL como indicador de recurso, y registro de clientes mediante Client ID Metadata Document o registro dinámico de clientes. La documentación del servidor MCP enumera sus herramientas, y la página de agentes de IA muestra cómo conectar tu app.
El ejemplo usa 14 nodos de diagrama, dentro del plan Free.
Preguntas frecuentes
¿Cuál es la diferencia entre un host, un cliente y un servidor MCP? El host es la aplicación de IA, como un IDE. Crea un cliente por servidor, y cada cliente mantiene una conexión dedicada con un servidor, que expone herramientas, recursos y prompts.
¿MCP no tiene estado ahora?
Sí, desde la revisión 2026-07-28: sin handshake initialize, sin ID de sesión, y cada petición lleva su propia versión y capacidades. Los servidores con revisiones anteriores siguen usando el handshake.
¿Qué transportes admite MCP? Dos estándar: stdio para servidores locales y Streamable HTTP para servidores remotos. HTTP+SSE está obsoleto, y los transportes personalizados deben conservar el formato de mensajes JSON-RPC.
¿Los servidores MCP locales necesitan OAuth? No. La especificación dice que los servidores stdio deberían tomar las credenciales del entorno. Da a cada uno un token de alcance limitado y aísla los servidores de terceros en un sandbox.
¿Qué es el token passthrough en MCP? Un servidor MCP que acepta un token que no se emitió para él, o que reenvía el token del cliente a otra API. La especificación lo prohíbe; las llamadas ascendentes necesitan el token propio del servidor.