MCP Remote
Un proxy remoto para MCP que permite a los clientes locales conectarse a servidores remotos mediante OAuth.
Documentación
mcp-remote
Conecta un Cliente MCP que solo admite servidores locales (stdio) a un Servidor MCP Remoto, con soporte de autenticación:
¿Por qué es necesario?
Hasta ahora, la mayoría de los servidores MCP en el mundo se instalan localmente, utilizando el transporte stdio. Esto tiene algunos beneficios: tanto el cliente como el servidor pueden confiar implícitamente el uno en el otro, ya que el usuario les ha otorgado permiso para ejecutarse. Agregar secretos como claves API se puede hacer usando variables de entorno y nunca salen de tu máquina. Y construir sobre npx y uvx ha permitido a los usuarios evitar pasos de instalación explícitos también.
Pero hay una razón por la que la mayoría del software que podría moverse a la web se movió a la web: es mucho más fácil encontrar y corregir errores e iterar sobre nuevas funciones cuando puedes enviar actualizaciones a todos tus usuarios con un solo despliegue.
Con la última especificación de Autorización de MCP, ahora tenemos una forma segura de compartir nuestros servidores MCP con el mundo sin ejecutar código en las computadoras portátiles de los usuarios. O al menos, lo tendrías, si todos los clientes MCP populares lo soportaran todavía. La mayoría son solo stdio, y aquellos que sí soportan HTTP+SSE aún no soportan los flujos OAuth requeridos.
Ahí es donde entra mcp-remote. Tan pronto como tu cliente MCP elegido soporte servidores remotos autorizados, puedes eliminarlo. Hasta ese momento, incorpora esta línea única y prepárate para los clientes MCP que quieras.
Uso
Todos los clientes MCP más populares (Claude Desktop, Cursor y Windsurf) usan el siguiente formato de configuración:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse"
]
}
}
}
Encabezados Personalizados
Para omitir la autenticación, o para emitir encabezados personalizados en todas las solicitudes a tu servidor remoto, pasa los argumentos CLI --header:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"Authorization: Bearer ${AUTH_TOKEN}"
],
"env": {
"AUTH_TOKEN": "..."
}
},
}
}
Nota: Cursor, Codex-Cli y Claude Desktop (Windows) tienen un error donde los espacios dentro de args no se escapan cuando se invoca npx, lo que termina distorsionando estos valores. Puedes solucionarlo usando:
{
// rest of config...
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"Authorization:${AUTH_HEADER}" // note no spaces around ':'
],
"env": {
"AUTH_HEADER": "Bearer <auth-token>" // spaces OK in env vars
}
},
Para mantener una credencial fuera de los argumentos del proceso — donde cualquier otro usuario en la máquina puede leerla desde la lista de procesos — coloca los encabezados en un archivo y pasa --header-file. Un Name: value por línea; # inicia un comentario.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header-file",
"/path/to/headers.txt"
]
# credentials for the example server
Authorization: Bearer my-token
X-Custom-Header: custom-value
Un archivo que no se puede leer es un error en lugar de una advertencia, por lo que una ruta mal escrita falla inmediatamente en lugar de enviar la solicitud sin autenticación.
Múltiples Instancias
Para ejecutar múltiples instancias del mismo servidor remoto con diferentes configuraciones (por ejemplo, diferentes inquilinos de Atlassian), usa la bandera --resource para aislar las sesiones OAuth:
{
"mcpServers": {
"atlassian_tenant1": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.atlassian.com/v1/sse",
"--resource",
"https://tenant1.atlassian.net/"
]
},
"atlassian_tenant2": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.atlassian.com/v1/sse",
"--resource",
"https://tenant2.atlassian.net/"
]
}
}
}
Cada combinación única de URL del servidor, recurso, encabezados personalizados y valores de --authorize-param mantendrá sesiones OAuth separadas y almacenamiento de tokens.
El valor de --resource se envía como el indicador de recurso RFC 8707 en las solicitudes de autorización, token y
actualización por igual, para que siempre estén de acuerdo.
Parámetros de autorización adicionales
Algunos servidores de autorización requieren sus propios parámetros en la llamada de autorización. Pasa cada uno como
--authorize-param key=value, repitiendo la bandera según sea necesario:
"args": [
"mcp-remote",
"https://remote.mcp.server/mcp",
"--authorize-param",
"access_type=offline",
"--authorize-param",
"prompt=consent"
]
Esos dos son lo que Google quiere antes de entregar un token de actualización — no reconoce el
ámbito offline_access. Auth0 quiere audience=https://your-api para emitir un JWT en lugar de un token
opaco. login_hint=user@example.com también es común.
Estos se aplican solo a la solicitud de autorización. resource es la excepción: RFC 8707 quiere el mismo
valor en las solicitudes de token y actualización también, y solo --resource lo coloca allí. Los parámetros que el flujo
deriva por solicitud — state, code_challenge, client_id, redirect_uri, response_type — son
rechazados, porque un valor que no coincide con el real se manifiesta como un error opaco del servidor.
Cambiar estos inicia un nuevo inicio de sesión, ya que un parámetro como audience decide para qué API es el
token y un token emitido para una no es válido para otra.
Algunos servidores de autorización rechazan el parámetro de recurso por completo — Microsoft Entra ID v2 responde
AADSTS9010010, por ejemplo. Pasa --disable-resource-parameter para omitirlo por completo:
{
"mcpServers": {
"entra-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/mcp",
"--disable-resource-parameter"
]
}
}
}
Banderas
- Si
npxestá produciendo errores, considera agregar-ycomo primer argumento para aceptar automáticamente la instalación del paquetemcp-remote.
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://remote.mcp.server/sse"
]
- Para forzar a
npxa verificar siempre una versión actualizada demcp-remote, agrega la bandera@latest:
"args": [
"mcp-remote@latest",
"https://remote.mcp.server/sse"
]
- Para cambiar el puerto en el que
mcp-remoteescucha una redirección OAuth, agrega un argumento adicional después de la URL del servidor. Por defecto, el puerto se deriva de la URL del servidor, por lo que cada servidor obtiene un puerto estable propio en algún lugar entre3335-49150, ymcp-remotesube hasta 8 puertos desde allí si encuentra uno ocupado. Un puerto que pasas explícitamente se usa tal cual: implica unredirect_urique ya se le ha dado al servidor de autorización, por lo quemcp-remotefalla en lugar de moverse silenciosamente a uno diferente.--static-oauth-client-infofija el puerto de la misma manera, por la misma razón.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"9696"
]
- Para cambiar el host que
mcp-remoteregistra como URL de devolución de llamada OAuth (por defectolocalhost), agrega la bandera--host.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--host",
"127.0.0.1"
]
- Para cambiar la ruta en la que
mcp-remotesirve la devolución de llamada OAuth (por defecto/oauth/callback), agrega la bandera--callback-path. La ruta debe comenzar con/, y/wait-for-authestá reservada.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--callback-path",
"/custom/callback"
]
- Para permitir conexiones HTTP en redes privadas de confianza, agrega la bandera
--allow-http. Nota: Esto solo debe usarse en redes privadas seguras donde el tráfico no pueda ser interceptado.
"args": [
"mcp-remote",
"http://internal-service.vpc/sse",
"--allow-http"
]
- Para habilitar registros de depuración detallados, agrega la bandera
--debug. Esto escribirá registros verbosos en~/.mcp-auth/{server_hash}_debug.logcon marcas de tiempo e información detallada sobre el proceso de autenticación, conexiones y actualización de tokens.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--debug"
]
- Para suprimir los registros predeterminados, agrega la bandera
--silent. Esto evitará que se emitan registros, excepto en el caso de que también se pase--debug.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--silent"
]
- Para habilitar un proxy HTTP(S) saliente para mcp-remote, agrega la bandera
--enable-proxy. Cuando está habilitado, mcp-remote usará la configuración de proxy de las variables de entorno comunes (por ejemplo,HTTP_PROXY,HTTPS_PROXYyNO_PROXY).
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--enable-proxy"
],
"env": {
"HTTPS_PROXY": "http://127.0.0.1:3128",
"NO_PROXY": "localhost,127.0.0.1"
}
- Para ignorar herramientas específicas del servidor remoto, agrega la bandera
--ignore-tool. Esto filtrará las herramientas que coincidan con los patrones especificados tanto de las respuestastools/listcomo bloqueará las solicitudestools/call. Admite patrones comodín con*.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--ignore-tool",
"delete*",
"--ignore-tool",
"remove*"
]
Puedes especificar múltiples banderas --ignore-tool para ignorar diferentes patrones. Ejemplos:
delete*- ignora todas las herramientas que comienzan con "delete" (por ejemplo,deleteTask,deleteUser)*account- ignora todas las herramientas que terminan con "account" (por ejemplo,getAccount,updateAccount)exactTool- ignora solo la herramienta llamada exactamente "exactTool"
- Para cambiar el tiempo de espera de la devolución de llamada OAuth (por defecto
30segundos), agrega la bandera--auth-timeoutcon un valor en segundos. Esto es útil si el proceso de autenticación en el lado del servidor toma mucho tiempo.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--auth-timeout",
"60"
]
-
Para cambiar los tiempos de espera de red, agrega
--connect-timeout,--headers-timeouto--body-timeout, cada uno con un valor en segundos. Estos se aplican a cada solicitud saliente, incluidas las de OAuth.--connect-timeoutlimita el establecimiento de la conexión TCP (predeterminado10). Redúcelo para fallar más rápido en un servidor inalcanzable.--headers-timeoutlimita la espera de los encabezados de respuesta (predeterminado300).--body-timeoutlimita el intervalo entre fragmentos del cuerpo de una respuesta (predeterminado300). Este es el que cierra un flujo SSE inactivo después de cinco minutos; pasa0para deshabilitarlo en servidores que envían con poca frecuencia.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--connect-timeout",
"30",
"--body-timeout",
"0"
]
-
Para evitar que se elimine una conexión inactiva, agrega la bandera
--keep-alive. El proxy entonces envía unpingcada 30 segundos, lo cual es suficiente tráfico para evitar que un servidor — o un balanceador de carga frente a uno — elimine una sesión que ha estado en silencio durante unos minutos. Usa--ping-intervalcon un valor en segundos para cambiar el período; activarlo enciende el keep-alive, por lo que las dos banderas solo se necesitan juntas cuando quieres que se especifique el período predeterminado.Este es el extremo opuesto del problema de
--body-timeout: ese gobierna cuánto tiempo nosotros esperamos, mientras que este evita que el otro lado cuelgue.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--keep-alive",
"--ping-interval",
"60"
]
- Para conectarte solo a través de IPv4, agrega la bandera
--ipv4. Útil cuando un nombre de host resuelve tanto a direcciones IPv4 como IPv6, pero las rutas IPv6 se convierten silenciosamente en agujeros negros en lugar de ser rechazadas — los intentos de conexión entonces se agotan en lugar de fallar, y la solicitud nunca se completa.
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--ipv4"
]
Estrategias de Transporte
MCP Remote admite diferentes estrategias de transporte al conectarse a un servidor MCP. Esto te permite controlar si usa el transporte de Eventos Enviados por el Servidor (SSE) o HTTP, y en qué orden los intenta.
Especifica la estrategia de transporte con la bandera --transport:
npx mcp-remote https://example.remote/server --transport sse-only
Estrategias Disponibles:
http-first(predeterminado): Intenta el transporte HTTP primero, y recurre a SSE si HTTP falla con un error 404sse-first: Intenta el transporte SSE primero, y recurre a HTTP si SSE falla con un error 405http-only: Solo usa el transporte HTTP, falla si el servidor no lo admitesse-only: Solo usa el transporte SSE, falla si el servidor no lo admite
Eras de Protocolo (servidores 2026-07-28)
La revisión 2026-07-28 de MCP retiró el protocolo de enlace initialize y la sesión detrás de él. Un
servidor que lo implementa atiende solicitudes sin estado que cada una lleva su propia versión de protocolo y
capacidades, y se anuncia a través de server/discover en lugar de responder a un protocolo de enlace.
La mayoría de los hosts de escritorio todavía hablan la era 2025-11-25. La matriz de compatibilidad de la especificación coloca
ese par — cliente heredado, servidor moderno — en la única celda que simplemente falla, porque un cliente heredado
no tiene forma de avanzar. La solución que nombra es un cliente de doble era, que es lo que mcp-remote
se convierte con --protocol auto:
npx mcp-remote https://example.remote/mcp --protocol auto
Modos Disponibles:
legacy(predeterminado): envía elinitializedel cliente directamente, exactamente como cada versión anterior lo hizo. No se sondea nada.auto: gasta unserver/discoveren el primer protocolo de enlace. Si un servidor2026-07-28responde,mcp-remoteresponde al protocolo de enlace del cliente local por sí mismo y reescribe cada solicitud posterior en la era moderna —_metapor solicitud, con el encabezadoMCP-Protocol-Versioncorrespondiente. Si cualquier otra cosa responde, el protocolo de enlace sale sin cambios y nada cambia.
Está desactivado por defecto porque cada servidor en el mundo hoy es uno heredado, y la sonda es un viaje de ida y vuelta que esas conexiones no necesitan.
Las dos superficies modernas sin equivalente 2025-11-25 también se conectan:
- Notificaciones de cambio. La era moderna solo envía
notifications/tools/list_changedy amigos por un flujosubscriptions/listenque el cliente abre. Un cliente de la era 2025 nunca abre uno, por lo quemcp-remotelo abre en nombre del cliente — solicitando exactamente las notificaciones que el servidor dijo que puede enviar — y pasa cada una en la forma que esa era espera. - Solicitudes de múltiples rondas. Cuando un servidor responde con
input_required, solicitando muestreo, elicitación o raíces en medio de una solicitud,mcp-remotedesempaca las preguntas integradas y se las presenta al cliente como las solicitudes ordinarias iniciadas por el servidor que ya entiende, luego reintenta la solicitud original con las respuestas y un eco byte-exacto delrequestStatedel servidor. Al cliente nunca se le dice que esto sucedió: todavía está esperando la única solicitud que envió, y eso es lo que se le responde. Limitado a 10 rondas. Una pregunta que este proxy no puede plantear a un cliente de la era 2025 — cualquier cosa fuera de muestreo, elicitación y raíces, o una elicitación en modo URL, o una que el cliente nunca declaró soportar — se reporta como un error en lugar de descartarse.
Tres métodos que la era moderna retiró son atendidos por mcp-remote mismo en lugar de reenviarse a un servidor que ya no los tiene, porque las capacidades que se le entregan al cliente aún los anuncian:
resources/subscribe/resources/unsubscribese convierten en entradas en el flujosubscriptions/listen, que se reabre cada vez que el conjunto cambia.logging/setLevelse registra y se transporta como elio.modelcontextprotocol/logLevelpor solicitud que lo reemplazó — sin el cual un servidor moderno no envía registros en absoluto.
Metadatos de Cliente OAuth Estáticos
MCP Remote admite proporcionar metadatos de cliente OAuth estáticos en lugar de usar los valores predeterminados de mcp-remote. Esto es útil al conectarse a servidores OAuth que esperan IDs de cliente/software o ámbitos específicos.
Proporcione los metadatos del cliente como una cadena JSON o como una ruta de archivo con prefijo @ con la bandera --static-oauth-client-metadata:
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '{ "scope": "space separated scopes" }'
# uses node readfile, so you probably want to use absolute paths if you're not sure what the cwd is
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '@/Users/username/Library/Application Support/Claude/oauth_client_metadata.json'
Lo que proporcione se fusiona sobre los valores predeterminados, por lo que así es también como se fija un valor que mcp-remote de otro modo negociaría. token_endpoint_auth_method se elige del token_endpoint_auth_methods_supported del servidor de autorización: none cuando el servidor acepta clientes públicos, de lo contrario client_secret_post, de lo contrario client_secret_basic. Anúlelo cuando el servidor necesite algo más:
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '{ "token_endpoint_auth_method": "client_secret_post" }'
Información de Cliente OAuth Estática
Según la especificación, se anima a los servidores, aunque no se les exige, a admitir el registro dinámico de clientes OAuth.
Para estos servidores, MCP Remote admite proporcionar información de cliente OAuth estática en su lugar. Esto es útil al conectarse a servidores OAuth que requieren clientes pre-registrados.
Proporcione los metadatos del cliente como una cadena JSON o como una ruta de archivo con prefijo @ con la bandera --static-oauth-client-info:
export MCP_REMOTE_CLIENT_ID=xxx
export MCP_REMOTE_CLIENT_SECRET=yyy
npx mcp-remote https://example.remote/server --static-oauth-client-info "{ \"client_id\": \"$MCP_REMOTE_CLIENT_ID\", \"client_secret\": \"$MCP_REMOTE_CLIENT_SECRET\" }"
# uses node readfile, so you probably want to use absolute paths if you're not sure what the cwd is
npx mcp-remote https://example.remote/server --static-oauth-client-info '@/Users/username/Library/Application Support/Claude/oauth_client_info.json'
Documentos de Metadatos de ID de Cliente
SEP-991 permite que un servidor de autorización acepte una URL HTTPS como el client_id, donde esa URL sirve un documento JSON que describe al cliente. Los servidores que lo admiten anuncian "client_id_metadata_document_supported": true en sus metadatos de servidor de autorización, y no se necesita registro dinámico.
Apunte mcp-remote a su documento con --client-metadata-url:
npx mcp-remote https://example.remote/server --client-metadata-url https://client.example.com/.well-known/oauth-client-metadata
La URL debe usar HTTPS y tener una ruta — un origen desnudo se rechaza. Si el servidor no anuncia soporte, mcp-remote se registra dinámicamente como de costumbre, por lo que la bandera es segura de dejar en su lugar.
El documento que aloja debe listar el redirect_uri que mcp-remote enviará, que contiene el puerto de devolución de llamada OAuth. Pasar esta bandera hace que ese puerto sea estricto: mcp-remote usa el puerto derivado de la URL del servidor (o el que pase explícitamente) y falla en lugar de moverse silenciosamente a otro, para que el redirect_uris en su documento permanezca correcto. Ejecútelo una vez para ver el puerto que eligió, o elíjalo usted mismo:
npx mcp-remote https://example.remote/server 3334 --client-metadata-url https://client.example.com/.well-known/oauth-client-metadata
Iniciar Sesión Sin un Usuario
Algunos servidores no están protegidos en nombre de una persona en absoluto — un servidor MCP interno alcanzado por un trabajo programado, por ejemplo, donde no hay usuario que consienta ni navegador en el que consentir. Para esos, --client-credentials usa la concesión de Credenciales de Cliente OAuth: el cliente presenta sus propias credenciales y recibe un token para sí mismo.
npx mcp-remote https://example.remote/mcp \
--client-credentials \
--static-oauth-client-info '{"client_id":"my-client","client_secret":"${MCP_CLIENT_SECRET}"}'
Las credenciales provienen de --static-oauth-client-info, que acepta JSON en línea o @path/to/file.json. Los marcadores de posición ${ENV_VAR} se expanden desde el entorno en ambas formas, por lo que el secreto no necesita estar en una línea de comandos donde cualquier otro proceso en la máquina pueda leerlo. Nada registra el valor expandido.
El punto final de token, el ámbito y el indicador resource de RFC 8707 se descubren y aplican de la misma manera que para cualquier otro flujo, y client_secret_basic o client_secret_post se elige de lo que anuncia el servidor de autorización. No hay token de actualización involucrado: las credenciales son lo duradero, por lo que un token caducado se reemplaza pidiendo otro de la misma manera que se obtuvo el primero.
Si un servidor interno no publica metadatos de descubrimiento RFC 9728 o RFC 8414/OIDC, proporcione su punto final de token conocido explícitamente. Esto omite el descubrimiento y solo se acepta con --client-credentials:
npx mcp-remote https://example.remote/mcp \
--client-credentials \
--token-endpoint https://auth.example.com/oauth/token \
--static-oauth-client-info '{"client_id":"my-client","client_secret":"${MCP_CLIENT_SECRET}"}' \
--static-oauth-client-metadata '{"scope":"mcp.read mcp.write","token_endpoint_auth_method":"client_secret_basic"}'
El punto final explícito debe usar HTTPS, excepto para un punto final de bucle de retorno HTTP. Se rechazan credenciales y fragmentos de URL en la URL del punto final, y cambiar el punto final selecciona una caché de tokens separada. El descubrimiento también se omite en el arranque en frío y en los reintentos de 401. Los tokens se renuevan antes de la caducidad usando las mismas credenciales de cliente; si la renovación falla, el token actual se envía hasta que el servidor lo rechace. Con un punto final explícito, scope se omite a menos que se configure con --static-oauth-client-metadata o se nombre en el desafío 401 del servidor, y resource se omite a menos que se establezca con --resource.
Iniciar Sesión Sin un Navegador
El flujo predeterminado necesita un navegador en esta máquina y un puerto de bucle de retorno para redirigir de vuelta — lo que un trabajo cron, una sesión SSH o un contenedor no tienen. Si su servidor de autorización admite la Concesión de Autorización de Dispositivo OAuth, --device-code mueve el navegador a cualquier máquina en la que realmente esté sentado:
npx mcp-remote https://example.remote/server --device-code
mcp-remote imprime un código corto y una URL, luego sondea hasta que lo apruebe:
To authorize this client, visit:
https://auth.example.com/activate
And enter the code: WDJB-MJHT
Waiting for approval...
La salida va a stderr, que los clientes MCP capturan en sus propios registros — así que en una ejecución sin cabeza, ese registro es donde lee el código. Esto solo tiene que suceder una vez: el token de actualización que regresa se almacena como cualquier otro, y las ejecuciones posteriores son no interactivas.
No se inicia ningún servidor de devolución de llamada y no se vincula ningún puerto, por lo que este es también el flujo a usar cuando el puerto de bucle de retorno no está disponible.
El servidor debe anunciar device_authorization_endpoint en sus metadatos de servidor de autorización; mcp-remote falla con un mensaje claro en lugar de recurrir a un navegador que no está allí. Tenga en cuenta que los servidores que ofrecen esta concesión a menudo esperan un cliente pre-registrado — combínelo con --static-oauth-client-info si se rechaza el registro dinámico.
Persistencia de Sesión del Balanceador de Carga
Las sesiones MCP viven en un backend, por lo que un servidor detrás de un balanceador de carga necesita que cada solicitud de un cliente llegue al mismo nodo. AWS ALB, Azure Load Balancer y otros hacen esto con una cookie que se espera que el cliente devuelva.
mcp-remote mantiene las cookies que el servidor MCP establece y las reenvía en solicitudes posteriores, incluso desde el flujo SSE hacia los POST que lo siguen. Nada que configurar. Las cookies se mantienen en memoria durante la vida del proceso, nunca se escriben en disco, y solo se envían de vuelta al origen exacto que las estableció — Domain se ignora, por lo que nada viaja a otro host.
Un Cookie que pase usted mismo con --header siempre gana.
Para desactivarlo:
npx mcp-remote https://example.remote/server --disable-cookies
Usar el Token de ID como Credencial de Portador
Por defecto, mcp-remote envía el token de acceso OAuth, que dice lo que al llamante se le permite hacer. Algunos servidores en su lugar verifican quién es el llamante: validan un token de ID OIDC contra un punto final JWKS y leen afirmaciones de identidad como sub y email de él. AWS Cognito frente a Bedrock AgentCore funciona de esta manera, y rechaza el token de acceso por completo.
Pase --use-id-token para enviar el token de ID en su lugar:
npx mcp-remote https://example.remote/server --use-id-token
Solo cambia la credencial presentada al servidor MCP — el token de actualización y el flujo de renovación no se tocan. La renovación sigue la afirmación exp del propio token de ID en lugar de la vida útil del token de acceso, ya que el token de ID es lo que realmente va por el cable.
Un token de ID solo se emite cuando openid está entre los ámbitos solicitados. Si su servidor no lo anuncia, pídalo explícitamente:
npx mcp-remote https://example.remote/server --use-id-token --static-oauth-client-metadata '{ "scope": "openid email" }'
Claude Desktop
Para agregar un servidor MCP a Claude Desktop, debe editar el archivo de configuración ubicado en:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Si aún no existe, es posible que deba habilitarlo en Configuración > Desarrollador.
Reinicie Claude Desktop para que tome los cambios en el archivo de configuración. Al reiniciar, debería ver un ícono de martillo en la esquina inferior derecha del cuadro de entrada.
Cursor
Documentos Oficiales. El archivo de configuración se encuentra en ~/.cursor/mcp.json.
A partir de la versión 0.48.0, Cursor admite servidores SSE sin autenticación directamente. Si su servidor MCP usa el protocolo de autorización OAuth oficial de MCP, aún necesita agregar un servidor "command" y llamar a mcp-remote.
Windsurf
Documentos Oficiales. El archivo de configuración se encuentra en ~/.codeium/windsurf/mcp_config.json.
Construcción de Servidores MCP Remotos
Para instrucciones sobre cómo construir e implementar servidores MCP remotos, incluido actuar como un cliente OAuth válido, consulte los siguientes recursos:
En particular, consulte:
- https://github.com/cloudflare/workers-oauth-provider para definir un servidor OAuth compatible con MCP en Cloudflare Workers
- https://github.com/cloudflare/agents/tree/main/examples/mcp para definir un
McpAgentusando el marcoagents.
Para más información sobre cómo probar estos servidores, consulte también:
¿Conoce más recursos que le gustaría compartir? ¡Agréguelos a este Readme y envíe un PR!
Solución de Problemas
Limpie su directorio ~/.mcp-auth
mcp-remote almacena toda la información de credenciales dentro de ~/.mcp-auth (o donde apunte su MCP_REMOTE_CONFIG_DIR). Si tiene problemas persistentes, intente ejecutar:
rm -rf ~/.mcp-auth
Luego reinicie su cliente MCP.
Las credenciales se almacenan bajo mcp-remote-v1, que nombra el diseño del almacén en lugar de la versión del paquete, por lo que actualizar mcp-remote ya no lo desconecta. Las versiones anteriores a este cambio mantenían un directorio separado por versión — si tiene directorios ~/.mcp-auth/mcp-remote-0.x.y sobrantes, contienen tokens antiguos y pueden eliminarse.
Verifique su versión de Node
Asegúrese de que la versión de Node que tiene instalada sea https://modelcontextprotocol.io/quickstart/server. Claude Desktop usará su versión del sistema de Node, incluso si tiene una versión más nueva instalada en otro lugar.
Reinicie Claude
Al modificar claude_desktop_config.json, puede ser útil reiniciar Claude por completo.
Certificados VPN
Puede encontrar problemas si está detrás de una VPN; puede intentar establecer la variable de entorno NODE_EXTRA_CA_CERTS para que apunte al archivo de certificado CA. Si usa claude_desktop_config.json, esto podría verse así:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse"
],
"env": {
"NODE_EXTRA_CA_CERTS": "{your CA certificate file path}.pem"
}
}
}
}
Revise los registros
- Siga los registros de Claude Desktop en tiempo real
- MacOS / Linux:
tail -n 20 -F ~/Library/Logs/Claude/mcp*.log - Para bash en WSL:
tail -n 20 -f "C:\Users\YourUsername\AppData\Local\Claude\Logs\mcp.log" - Powershell:
Get-Content "C:\Users\YourUsername\AppData\Local\Claude\Logs\mcp.log" -Wait -Tail 20
Depuración
Registros de Depuración
Para solucionar problemas complejos, especialmente con la renovación de tokens o problemas de autenticación, use la bandera --debug:
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--debug"
]
Esto crea registros detallados en ~/.mcp-auth/{server_hash}_debug.log con marcas de tiempo e información completa sobre cada paso del proceso de conexión y autenticación. Cuando encuentre problemas con la renovación de tokens, problemas de suspensión/reanudación de la computadora portátil o problemas de autenticación, proporcione estos registros al buscar soporte.
Errores de Autenticación
Si encuentra el siguiente error, devuelto por la URL /callback:
Authentication Error
Token exchange failed: HTTP 400
Puede ejecutar rm -rf ~/.mcp-auth para limpiar cualquier estado y tokens almacenados localmente.
Modo "Cliente"
Ejecute lo siguiente en la línea de comandos (no desde un servidor MCP):
npx -p mcp-remote@latest mcp-remote-client https://remote.mcp.server/sse
Esto ejecutará todo el flujo de autorización e intentará listar las herramientas y recursos en la URL remota. Intente esto después de ejecutar rm -rf ~/.mcp-auth para ver si las credenciales obsoletas son su problema; de lo contrario, con suerte el problema será más obvio en estos registros que en los de su cliente MCP.
Agradecimientos
Glen Maddern es el autor original de mcp-remote. Él construyó mcp-remote en uno de los bloques de construcción más populares en el ecosistema MCP.