
mcp-remote expuesto a inyección de comandos del sistema operativo
mcp-remoteConecta un Cliente MCP que solo soporta servidores locales (stdio) a un Servidor MCP Remoto, con soporte de autenticación:
Nota: esto es una prueba de concepto funcional pero debe considerarse experimental.
Hasta ahora, la mayoría de los servidores MCP existentes 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. Además, basarse en npx y uvx ha permitido a los usuarios evitar pasos de instalación explícitos.
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 en 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 laptops de los usuarios. O al menos, lo harías, si todos los clientes MCP populares ya lo soportaran. 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 y ¡vístete para los clientes MCP que quieras!
Todos los clientes MCP más populares (Claude Desktop, Cursor y Windsurf) utilizan el siguiente formato de configuración:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse"
]
}
}
}
Para omitir la autenticación, o para emitir cabeceras personalizadas en todas las solicitudes a tu servidor remoto, pasa argumentos --header en la CLI:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"Authorization: Bearer ${AUTH_TOKEN}"
],
"env": {
"AUTH_TOKEN": "..."
}
},
}
}
Nota: Cursor y Claude Desktop (Windows) tienen un error donde los espacios dentro de args no se escapan cuando invoca npx, lo que termina distorsionando estos valores. Puedes solucionarlo usando:
{
// resto de la configuración...
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"Authorization:${AUTH_HEADER}" // nota: sin espacios alrededor de ':'
],
"env": {
"AUTH_HEADER": "Bearer <auth-token>" // espacios OK en variables de entorno
}
},
npx produce errores, considera agregar -y como primer argumento para aceptar automáticamente la instalación del paquete mcp-remote. "command": "npx",
"args": [
"-y"
"mcp-remote",
"https://remote.mcp.server/sse"
]
npx a buscar siempre una versión actualizada de mcp-remote, agrega la bandera @latest: "args": [
"mcp-remote@latest",
"https://remote.mcp.server/sse"
]
mcp-remote escucha una redirección OAuth (por defecto 3334), agrega un argumento adicional después de la URL del servidor. Ten en cuenta que, independientemente del puerto que especifiques, si no está disponible, se elegirá un puerto abierto al azar. "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"9696"
]
mcp-remote registra como URL de callback OAuth (por defecto localhost), agrega la bandera --host. "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--host",
"127.0.0.1"
]
--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"
]
--debug. Esto escribirá registros verbosos en ~/.mcp-auth/{server_hash}_debug.log con 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"
]
--enable-proxy. Cuando está habilitado, mcp-remote usará la configuración de proxy de variables de entorno comunes (por ejemplo HTTP_PROXY, HTTPS_PROXY y NO_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"
}
--ignore-tool. Esto filtrará las herramientas que coincidan con los patrones especificados tanto en las respuestas tools/list como bloqueará las solicitudes tools/call. Soporta 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" (ej., deleteTask, deleteUser)*account - ignora todas las herramientas que terminan con "account" (ej., getAccount, updateAccount)exactTool - ignora solo la herramienta llamada exactamente "exactTool"30 segundos), agrega la bandera --auth-timeout con un valor en segundos. Esto es útil si el proceso de autenticación en el lado del servidor lleva mucho tiempo. "args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--auth-timeout",
"60"
]
MCP Remote soporta diferentes estrategias de transporte al conectarse a un servidor MCP. Esto te permite controlar si usa transporte Server-Sent Events (SSE) o HTTP, y en qué orden lo intenta.
Especifica la estrategia de transporte con la bandera --transport:
npx mcp-remote https://example.remote/server --transport sse-only
Estrategias Disponibles:
http-first (predeterminada): Intenta el transporte HTTP primero, retrocede a SSE si HTTP falla con un error 404sse-first: Intenta el transporte SSE primero, retrocede a HTTP si SSE falla con un error 405http-only: Solo usa el transporte HTTP, falla si el servidor no lo soportasse-only: Solo usa el transporte SSE, falla si el servidor no lo soportaMCP Remote soporta proporcionar metadatos estáticos del cliente OAuth en lugar de usar los valores predeterminados de mcp-remote. Esto es útil al conectarse a servidores OAuth que esperan identificadores de cliente/software o ámbitos específicos.
Proporciona los metadatos del cliente como una cadena JSON o como una ruta de archivo prefijada con @ usando la bandera --static-oauth-client-metadata:
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '{ "scope": "scopes separados por espacio" }'
# usa node readfile, por lo que probablemente quieras usar rutas absolutas si no estás seguro del directorio de trabajo
npx mcp-remote https://example.remote/server --static-oauth-client-metadata '@/Users/username/Library/Application Support/Claude/oauth_client_metadata.json'
Según la especificación, se recomienda a los servidores, pero no es obligatorio, que soporten el registro dinámico de clientes OAuth.
Para estos servidores, MCP Remote soporta proporcionar información estática del cliente OAuth en su lugar. Esto es útil al conectarse a servidores OAuth que requieren clientes pre-registrados.
Proporciona los metadatos del cliente como una cadena JSON o como una ruta de archivo prefijada con @ usando 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\" }"
# usa node readfile, por lo que probablemente quieras usar rutas absolutas si no estás seguro del directorio de trabajo
npx mcp-remote https://example.remote/server --static-oauth-client-info '@/Users/username/Library/Application Support/Claude/oauth_client_info.json'
Para agregar un servidor MCP a Claude Desktop necesitas editar el archivo de configuración ubicado en:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonSi aún no existe, puede que necesites habilitarlo en Settings > Developer.
Reinicia Claude Desktop para que los cambios en el archivo de configuración surtan efecto. Al reiniciar, deberías ver un ícono de martillo en la esquina inferior derecha del campo de entrada.
Documentación Oficial. El archivo de configuración se encuentra en ~/.cursor/mcp.json.
A partir de la versión 0.48.0, Cursor soporta servidores SSE sin autenticación directamente. Si tu servidor MCP está usando el protocolo oficial de autorización OAuth de MCP, aún necesitas agregar un servidor de "command" y llamar a mcp-remote.
Documentación Oficial. El archivo de configuración se encuentra en ~/.codeium/windsurf/mcp_config.json.
Para obtener instrucciones sobre cómo construir y desplegar servidores MCP remotos, incluyendo actuar como un cliente OAuth válido, consulta los siguientes recursos:
En particular, consulta:
McpAgent usando el framework agents.Para obtener más información sobre cómo probar estos servidores, consulta también:
¿Conoces más recursos que te gustaría compartir? ¡Agrégalos a este Readme y envía un PR!
~/.mcp-authmcp-remote almacena toda la información de credenciales dentro de ~/.mcp-auth (o donde apunte tu MCP_REMOTE_CONFIG_DIR). Si tienes problemas persistentes, intenta ejecutar:
rm -rf ~/.mcp-auth
Luego reinicia tu cliente MCP.
Asegúrate de que la versión de Node que tienes instalada sea 18 o superior. Claude Desktop usará la versión de Node de tu sistema, incluso si tienes una versión más nueva instalada en otro lugar.
Al modificar claude_desktop_config.json puede ser útil reiniciar Claude por completo.
Puedes encontrar problemas si estás detrás de una VPN, puedes intentar configurar la variable de entorno NODE_EXTRA_CA_CERTS
para que apunte al archivo de certificado CA. Si usas 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": "{ruta a tu archivo de certificado CA}.pem"
}
}
}
}
tail -n 20 -F ~/Library/Logs/Claude/mcp*.logtail -n 20 -f "C:\Users\TuUsuario\AppData\Local\Claude\Logs\mcp.log"Get-Content "C:\Users\TuUsuario\AppData\Local\Claude\Logs\mcp.log" -Wait -Tail 20Para solucionar problemas complejos, especialmente con la actualización de tokens o problemas de autenticación, usa 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 encuentres problemas con la actualización de tokens, suspensión/reanudación del portátil o problemas de autenticación, proporciona estos registros al buscar soporte.
Si encuentras el siguiente error, devuelto por la URL /callback:
Error de Autenticación
Intercambio de token fallido: HTTP 400
Puedes ejecutar rm -rf ~/.mcp-auth para limpiar cualquier estado y tokens almacenados localmente.
Ejecuta 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 recorrerá todo el flujo de autorización e intentará listar las herramientas y recursos en la URL remota. Prueba esto después de ejecutar rm -rf ~/.mcp-auth para ver si las credenciales obsoletas son tu problema; de lo contrario, con suerte el problema será más evidente en estos registros que en los de tu cliente MCP.