Saltar al contenido principal

Protección de servidores MCP: OAuth, vinculación de audiencia y el diputado confundido

Avanzado
What you'll learn
  • Entender por qué un servidor MCP remoto (HTTP) es un servidor de recursos OAuth 2.1, y no solo un endpoint con clave de API
  • Seguir el handshake de descubrimiento: 401 → Metadatos de recurso protegido → Metadatos del servidor de autorización → token
  • Explicar la vinculación de audiencia del token (RFC 8707) y por qué impide que el token de un servicio funcione en otro
  • Nombrar la trampa del diputado confundido y la única regla que la cierra: nunca reenvíes el token de un cliente a una API upstream
  • Aplicar una breve lista de verificación de endurecimiento antes de exponer un servidor MCP a internet

MCP pasó de ser una novedad a la forma predeterminada en que los agentes acceden a herramientas, lo que significa que los servidores MCP ahora se sitúan frente a datos reales y acciones reales. Un servidor local que lanzas sobre STDIO confía en su entorno: lee las credenciales de variables de entorno y no hay ninguna frontera de red que defender. En el momento en que conviertes ese mismo servidor en remoto (HTTP), cualquiera que pueda alcanzar la URL puede intentar llamarlo. Eso lo convierte en un problema de autorización, y la especificación MCP responde con OAuth 2.1, no con un esquema de clave de API a medida.

Esta página trata sobre el caso remoto. Si tu servidor es solo STDIO, la especificación dice explícitamente que no sigas el flujo OAuth: extrae las credenciales del entorno y continúa.

Los tres roles

OAuth divide el problema en tres partes. MCP se mapea sobre ellas de forma limpia:

Quién es quién en un flujo OAuth de MCP
Pulsa Intro o Espacio para girar la tarjeta. Usa las flechas izquierda y derecha para moverte entre las tarjetas.Término mostrado.
1 / 3

El cambio mental clave: el servidor MCP nunca gestiona el inicio de sesión por sí mismo. Solo valida tokens que otro emitió. Esa separación es lo que te permite poner un proveedor de identidad estándar frente a un servidor que tú escribiste.

El handshake de descubrimiento

Un cliente no debería necesitar estar preconfigurado con el lugar donde autenticarse. MCP hace que el descubrimiento sea automático, impulsado por un 401:

Guided walkthrough1 of 6
  1. La primera solicitud sale sin credenciales. El servidor la rechaza con HTTP 401 Unauthorized y una cabecera WWW-Authenticate que apunta a su URL de metadatos de recurso.

Fíjate en que no hay configuración de autenticación fija en el lado del cliente: el 401 arranca todo. Ese es el objetivo central: un agente puede conectarse a un servidor que nunca ha visto y descubrir cómo autenticarse.

Vinculación de audiencia: la regla que sostiene todo

Aquí está el modo de fallo que la vinculación de audiencia existe para prevenir. Supongamos que un usuario tiene un token emitido para calendar.example.com. Un servidor MCP malicioso (o simplemente descuidado) en evil.example.com engaña al cliente para que le envíe ese token. Si evil lo acepta, ahora puede darse la vuelta y llamar a la API de calendario como el usuario. El token de un servicio funcionó en otro. La frontera de seguridad de OAuth acaba de colapsar.

La solución son los Resource Indicators (RFC 8707):

Guided walkthrough1 of 3
  1. Tanto en la solicitud de autorización como en la solicitud de token, el cliente DEBE incluir un parámetro resource fijado a la URI canónica del servidor MCP que pretende llamar, p. ej. resource=https://mcp.example.com. Lo envía incluso si no está seguro de que el AS lo soporte.

Parámetro resource en la solicitud de autorización (codificado en URL)

&resource=https%3A%2F%2Fmcp.example.com

Las URIs canónicas son estrictas: https://mcp.example.com y https://mcp.example.com:8443/mcp son válidas; mcp.example.com (sin esquema) y https://mcp.example.com#frag (fragmento) no lo son. Prefiere la forma sin barra final por interoperabilidad.

El diputado confundido: nunca reenvíes el token

Este es el error que convierte un servidor MCP bienintencionado en el proxy de un atacante. Es el mismo problema del diputado confundido de la seguridad de agentes, afinado a una única regla concreta.

Un servidor MCP a menudo necesita llamar a una API upstream (GitHub, un servicio de base de datos, otro SaaS). La tentación es tomar el token que el cliente te entregó y reenviarlo upstream. No lo hagas. La especificación es tajante: el servidor MCP NO DEBE reenviar el token que recibió del cliente.

Por qué es peligroso: el token del cliente fue emitido para tu servidor como su audiencia. Si lo reenvías, la API upstream podría confiar en él como si viniera de ti, o asumir que ya lo validaste, y ahora un token con alcance para un salto está haciendo trabajo a dos saltos de distancia, fuera del modelo de consentimiento de nadie.

Watch out
  • Si tu servidor MCP llama a una API upstream, actúa como un cliente OAuth SEPARADO frente a esa API y obtiene su PROPIO token del servidor de autorización upstream. Dos tokens independientes, dos audiencias independientes. El token del cliente se detiene en tu puerta.

Una lista de verificación de endurecimiento previa al despliegue

Antes de que un servidor MCP remoto toque internet público:

Guided walkthrough1 of 7
  1. Todos los endpoints del AS DEBEN ser HTTPS. Las URIs de redirección DEBEN ser HTTPS o localhost, nada más.

Ponte a prueba

Ponte a prueba

0/4
  1. Un servidor MCP remoto recibe una solicitud sin token de acceso. ¿Qué exige la especificación que haga primero?
  2. ¿Contra qué protege la vinculación de audiencia del token (RFC 8707)?
  3. Tu servidor MCP necesita llamar a una API upstream de GitHub. ¿Qué debería hacer con el token de acceso que le envió el cliente?
  4. Para un servidor MCP STDIO (local), ¿cómo dice la especificación que deben gestionarse las credenciales?

Fuentes y lecturas adicionales